Skip to content

feat(collections): implement IDictionary<TKey,TValue> on the dictionary family - #338

Merged
marius-bughiu merged 5 commits into
mainfrom
feat/issue-307-idictionary
Aug 2, 2026
Merged

feat(collections): implement IDictionary<TKey,TValue> on the dictionary family#338
marius-bughiu merged 5 commits into
mainfrom
feat/issue-307-idictionary

Conversation

@marius-bughiu

@marius-bughiu marius-bughiu commented Aug 2, 2026

Copy link
Copy Markdown
Owner

Closes #307.

The set family got the mutable interface (ISet<T>) in 2.2.0 and is getting the read-only one in #306. The dictionary family had the inverse gap: IReadOnlyDictionary<,> and not IDictionary<,>. Since IDictionary<,> does not derive from IReadOnlyDictionary<,>, passing any Celerity dictionary except BTreeDictionary to an existing API taking IDictionary<,> was a hard compile error — the same Guiding Principle #3 drop-in defect, one level up.

What changed

Collection (src/Celerity/Collections/) — nine types now declare IDictionary<TKey, TValue?> alongside IReadOnlyDictionary<TKey, TValue?>: CelerityDictionary, SwissDictionary, RobinHoodDictionary, HashCachingDictionary, PooledCelerityDictionary, SmallDictionary, IntDictionary, LongDictionary, EnumMap. Every member is an explicit-interface forwarder onto the existing public surface — no existing public signature moved, and the concrete indexer still returns the non-nullable TValue (IndexerReturnTypeTests passes untouched).

Semantics, all matching Dictionary<,>:

Member Behaviour
IsReadOnly false
Add(TKey, TValue?) throwing duplicate contract; TryAdd stays the non-throwing path
Keys / Values the existing struct views, widened to read-only ICollection<T>Add / Clear / Remove throw NotSupportedException
Contains / Remove over a KeyValuePair<,> match on the pair; a stale value must not delete the current entry
CopyTo null / negative / past-end / insufficient-space guards

Two design calls worth flagging for review:

  1. The views were widened, not wrapped. KeyCollection / ValueCollection went from IEnumerable<T> to ICollection<T> rather than getting a separate boxed adapter type. That keeps dict.Keys allocation-free on the direct path while the interface-typed Keys still hands back a read-only collection. Contains, CopyTo and IsReadOnly are public on the views, and CopyTo(KeyValuePair<TKey, TValue?>[], int) is public on the dictionaries — mirroring BTreeDictionary, which already had both.

  2. EnumMap is in, not out. The issue flagged its bounded key universe as a possible reason to leave it out. An out-of-range enum cast is rejected with ArgumentOutOfRangeException, which is an ArgumentException — the failure IDictionary<,>.Add already documents for a key it cannot accept — so this is an honest implementation, not a member that throws where the contract says it should not. Documented in the API reference and pinned by EnumMap_InterfaceAdd_ShouldRejectOutOfRangeKey.

Deliberately excluded, stated in the test class doc and the ROADMAP: FrozenCelerityDictionary (immutable), LruCache (evicts on insert, so Add could silently drop an unrelated entry), CelerityMultiMap (many values per key), and Trie<TValue> — the one genuine one-value-per-key mutable dictionary left out, because its Keys / Values are lazy IEnumerable<T> traversals rather than counted struct views, so widening them is a design change rather than a forwarder. Worth its own issue if wanted.

Parity rollout

  • Cross-collection tests — new src/Celerity.Tests/Collections/DictionaryInterfaceTests.cs: the mirror of ReadOnlyDictionaryInterfaceTests. One row per dictionary drives the whole interface surface against a Dictionary<,> oracle, plus the bind-to-an-IDictionary<,>-parameter case the issue reports as a compile error, EnumMap's out-of-range key, the disposed-PooledCelerityDictionary corner, and the no-version-bump-on-overwrite rule through the interface indexer. BTreeDictionary joins the suite so the family contract is asserted in one place rather than drifting per type.
  • Dedicated tests — no new type shipped, so the existing per-type files are unchanged; the interface is a family-wide contract and belongs in the shared suite. Every other shared suite (AddAndTryAddTests, ContainsValueTests, IndexerReturnTypeTests, LoadFactorBoundaryTests, RemoveOutValueTests, ClearNoOpVersionTests, …) covers concrete members that did not change; all pass untouched.
  • Native AOTCelerity.AotSmokeTest now drives the whole interface surface across the seven int-keyed dictionaries plus the long- and enum-keyed shapes. Worth having: Keys / Values are readonly structs reached through ICollection<T>, so the interface path boxes them and dispatches through an unboxing stub ILC has to generate — a foreach over the concrete type never compiles that path. All three aot-publish legs pass.
  • Benchmarks — none added, as the issue scoped: these are explicit-interface members with no change to any concrete hot path, so a benchmark would measure interface-dispatch boxing rather than a Celerity property. No Program.cs registration needed.
  • Dashboard — N/A: no new collection, so no COLLECTIONS entry in web/dev/bench/index.html / detail.html and no new ship card in web/index.html.
  • Docsdocs/api/collections.md gains an IDictionary<TKey, TValue?> section (semantics table, read-only views, nullability note, runnable example) under CelerityDictionary, the declaration fences and peer prose updated for all nine types, and an EnumMap bounded-universe caveat. README.md: the "All dictionaries implement…" paragraph, the API-surface paragraph, and the stale "BTreeDictionary<,> also implements the mutable IDictionary<,>" sentence under "Choosing a collection".
  • CHANGELOG — four [Unreleased]### Added bullets (interface, public CopyTo / view members, tests, docs).
  • ROADMAP — the drop-in-parity bullet now records the dictionary half as done with the two design calls; the set half stays in-progress behind Implement IReadOnlySet<T> on the ten mutable sets #306.

Test plan

  • dotnet build — clean, 0 warnings on Celerity.dll across net8.0 / net9.0 / net10.0
  • dotnet test5242 passed, 0 failed on all three TFMs
  • Coverage — 100.00% line / 100.00% branch via coverage.runsettings + scripts/coverage_report.py at the 100/100 floor
  • dotnet pack -c ReleaseEnablePackageValidation against the 2.4.0 baseline passes; the change is additive and binary-compatible
  • CI matrix (build + test across the TFM matrix, coverage gate, benchmarks, AOT smoke test)
  • No gh-pages dashboard refresh expected on merge — no benchmark class was added or renamed

🤖 Generated with Claude Code

…ry family

The set family got ISet<T> in 2.2.0; the dictionaries had the inverse gap —
IReadOnlyDictionary<,> but not the mutable interface. IDictionary<,> does not
derive from IReadOnlyDictionary<,>, so passing any Celerity dictionary except
BTreeDictionary to an existing API taking IDictionary<,> was a hard compile
error: the Guiding Principle #3 drop-in defect, one level up.

Nine types now declare IDictionary<TKey, TValue?> alongside the read-only
interface: CelerityDictionary, SwissDictionary, RobinHoodDictionary,
HashCachingDictionary, PooledCelerityDictionary, SmallDictionary, IntDictionary,
LongDictionary and EnumMap. Every member is an explicit-interface forwarder onto
the existing public surface, so no existing public signature moved and the
concrete indexer still returns the non-nullable TValue.

Two calls worth recording:

* The KeyCollection / ValueCollection struct views were widened from
  IEnumerable<T> to ICollection<T> rather than boxed into a fresh adapter type.
  dict.Keys stays allocation-free on the direct path while IDictionary<,>.Keys
  hands back a read-only ICollection<TKey> whose Add / Clear / Remove throw
  NotSupportedException, exactly as Dictionary<,>.KeyCollection does. CopyTo,
  Contains and IsReadOnly are public on the views, and CopyTo(KeyValuePair[], int)
  is public on the dictionaries, matching BTreeDictionary.

* EnumMap was kept in rather than left out for its bounded key universe. An
  out-of-range enum cast is rejected with ArgumentOutOfRangeException, which is
  an ArgumentException — the failure IDictionary<,>.Add already documents for a
  key it cannot accept — so the implementation is honest rather than a member
  that throws where the contract says it should not. Documented on both surfaces
  and pinned by a test.

Trie<TValue> is the one mutable one-value-per-key dictionary deliberately left
out: its Keys / Values are lazy IEnumerable<T> traversals, not counted views, so
widening them is a design change rather than a forwarder. FrozenCelerityDictionary
is immutable, LruCache evicts on insert, and CelerityMultiMap is multi-valued;
all three keep the read-only interface only.

DictionaryInterfaceTests drives every member through the interface against a
Dictionary<,> oracle, one row per dictionary (BTreeDictionary included, so the
family contract lives in one place). Coverage holds at 100% line and branch.

Closes #307
Copilot AI review requested due to automatic review settings August 2, 2026 01:26
@github-actions

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown

Coverage

Metric Value
Line 100% (11492/11492)
Branch 100% (4718/4718)

…moke test

Keys / Values are readonly structs reached through ICollection<T>, so the
interface path boxes them and dispatches through an unboxing stub ILC has to
generate. A foreach over the concrete type never compiles that path, so the
smoke test now drives the whole interface surface — including the boxed views,
their CopyTo, and the NotSupportedException from a view mutator — across the
seven int-keyed dictionaries plus the long- and enum-keyed shapes.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR closes the drop-in parity gap for the dictionary family by adding the mutable BCL interface IDictionary<TKey, TValue?> (alongside the already-supported IReadOnlyDictionary<TKey, TValue?>) across the Celerity dictionary implementations, plus shared cross-collection contract tests and documentation updates.

Changes:

  • Add IDictionary<TKey, TValue?> to the mutable dictionary types via explicit-interface forwarders (keeping existing public signatures intact).
  • Widen Keys / Values struct views to implement read-only ICollection<T> (mutators throw NotSupportedException) and add public CopyTo(KeyValuePair<,>[], int) on the dictionaries.
  • Add DictionaryInterfaceTests to validate IDictionary<,> semantics across the family against a BCL Dictionary<,> oracle; update docs/README/ROADMAP/CHANGELOG accordingly.

Reviewed changes

Copilot reviewed 15 out of 15 changed files in this pull request and generated no comments.

Show a summary per file
File Description
src/Celerity/Collections/CelerityDictionary.cs Adds IDictionary<,> implementation + public CopyTo and read-only ICollection key/value views.
src/Celerity/Collections/SwissDictionary.cs Same IDictionary<,> surface + view widening and CopyTo.
src/Celerity/Collections/RobinHoodDictionary.cs Same IDictionary<,> surface + view widening and CopyTo.
src/Celerity/Collections/HashCachingDictionary.cs Same IDictionary<,> surface + view widening and CopyTo.
src/Celerity/Collections/PooledCelerityDictionary.cs Same IDictionary<,> surface + view widening and CopyTo, preserving disposed-state checks.
src/Celerity/Collections/SmallDictionary.cs Same IDictionary<,> surface + view widening and CopyTo.
src/Celerity/Collections/IntDictionary.cs Adds IDictionary<,> for int-keyed dictionary + view widening and CopyTo.
src/Celerity/Collections/LongDictionary.cs Adds IDictionary<,> for long-keyed dictionary + view widening and CopyTo.
src/Celerity/Collections/EnumMap.cs Adds IDictionary<,> with bounded-key behavior preserved; view widening and CopyTo.
src/Celerity.Tests/Collections/DictionaryInterfaceTests.cs New shared suite asserting IDictionary<,> behavior across dictionary types (and includes BTreeDictionary).
docs/api/collections.md Documents IDictionary<,> semantics and updates type declarations/notes across the affected dictionaries.
README.md Updates public-facing interface support statements and guidance.
CHANGELOG.md Adds [Unreleased] entries describing the new interface support, tests, and docs.
ROADMAP.md Updates roadmap status for the dictionary-half of the interface parity work.

…what it returns

SumCountThroughInterface sums nothing — it returns Count through the
interface-typed parameter. Rename it CountThroughInterface.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 15 out of 15 changed files in this pull request and generated no new comments.

Suppressed comments (1)

CHANGELOG.md:12

  • The new [Unreleased] changelog entries are very long and implementation-detailed for this repo’s changelog conventions. CONTRIBUTING.md/CLAUDE.md ask for short, user-facing bullets (a few sentences at most) because the entire section becomes the GitHub Release body and can hit size limits. Consider condensing these four bullets to shorter summaries.
- **`IDictionary<TKey, TValue?>` on the mutable dictionary family** — `CelerityDictionary`, `SwissDictionary`, `RobinHoodDictionary`, `HashCachingDictionary`, `PooledCelerityDictionary`, `SmallDictionary`, `IntDictionary`, `LongDictionary` and `EnumMap` now implement the mutable BCL interface alongside `IReadOnlyDictionary<,>`, so passing one to an existing API taking `IDictionary<,>` compiles. `Keys` / `Values` widen to read-only `ICollection<T>` views whose mutators throw `NotSupportedException`, and `Contains` / `Remove` over a `KeyValuePair<,>` match on the pair rather than the key alone — both matching `Dictionary<,>`. Additive: no existing public signature changed, and `EnumMap`'s bounded key universe still rejects an out-of-range cast on the write surface. Closes [#307](https://github.com/marius-bughiu/Celerity/issues/307).
- A public `CopyTo(KeyValuePair<TKey, TValue?>[], int)` on each of those nine dictionaries, and `Contains` / `CopyTo` / `IsReadOnly` on their `KeyCollection` / `ValueCollection` views. Closes [#307](https://github.com/marius-bughiu/Celerity/issues/307).
- `DictionaryInterfaceTests` — a cross-collection suite driving every `IDictionary<,>` member through the interface against a `Dictionary<,>` oracle, one row per dictionary (`BTreeDictionary` included, so the family contract lives in one place), plus the bind-to-an-`IDictionary`-parameter case, `EnumMap`'s out-of-range key, and the disposed-`PooledCelerityDictionary` corner. Native AOT smoke coverage drives the same surface, since the boxed `Keys` / `Values` views are the one path a `foreach` over the concrete type never compiles. Closes [#307](https://github.com/marius-bughiu/Celerity/issues/307).
- Docs for the new interface: an `IDictionary<TKey, TValue?>` section in the API reference covering the semantics table and the read-only views, `EnumMap`'s bounded-universe caveat, and the updated README interface notes. Closes [#307](https://github.com/marius-bughiu/Celerity/issues/307).

Copilot AI review requested due to automatic review settings August 2, 2026 01:33
…, user-facing form

Addresses the Copilot review's suppressed CHANGELOG.md:12 comment: the four
bullets read as an implementation walkthrough, which CONTRIBUTING.md and
CLAUDE.md rule out — the whole section becomes the GitHub Release body and this
repo has overrun the size cap before. The rollout is still reconstructible from
one bullet per facet, just tersely.
@marius-bughiu

Copy link
Copy Markdown
Owner Author

Addressing the suppressed review comment on CHANGELOG.md:12 (no inline thread exists to resolve, so replying here).

Agreed, and fixed in f96f5c0. The four bullets were an implementation walkthrough — the first one alone named all nine types, the view semantics, the pair-matching rule and the EnumMap caveat in a single paragraph. CONTRIBUTING.md and CLAUDE.md both call for short, user-facing entries precisely because .github/workflows/release.yml lifts the whole ## [X.Y.Z] section verbatim into the GitHub Release body, and this repo has overrun that cap before.

They now read as one tight line per rollout facet — interface, public CopyTo / view members, tests, docs — so the rollout is still reconstructible from the changelog alone without the prose. The detail that was in there lives where it belongs: the semantics table in docs/api/collections.md, and the two design calls in ROADMAP.md and the PR body.

Two other things from this round, for the record:

  • The first review (622f07a) and this one both generated no inline comments; the only finding either produced was the suppressed one above, which is now handled.
  • Verifying an anchor I added in the docs turned up a genuine pre-existing bug, filed separately as Seven broken intra-doc anchors in docs/api/collections.md (entity-encoded generic headings slug differently than assumed) #339 rather than folded in here: seven intra-document links in docs/api/collections.md point at anchors that do not exist. Entity-encoded generic headings slug differently than the links assume — ## CeleritySet&lt;T, THasher&gt; renders as #celeritysett-thasher, not #celerityset-t-thasher. Confirmed against the live rendering via the GitHub HTML content endpoint, not inferred. The three anchors added in this PR use the correct form.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 15 out of 15 changed files in this pull request and generated no new comments.

Suppressed comments (3)

src/Celerity/Collections/PooledCelerityDictionary.cs:912

  • ValueCollection.Count / IsReadOnly access _dict._count without a disposed check. Like the key view, a previously captured values view can still be queried after the dictionary is disposed, which is inconsistent with the rest of PooledCelerityDictionary throwing ObjectDisposedException after disposal.
        public int Count => _dict._count;

        /// <summary>Gets a value indicating whether the view is read-only. Always <c>true</c>.</summary>
        public bool IsReadOnly => true;

src/Celerity/Collections/PooledCelerityDictionary.cs:813

  • KeyCollection.Count / IsReadOnly read _dict._count without checking the disposed state. If a caller captures var keys = dict.Keys; and then disposes the dictionary, keys.Count still succeeds even though other members consistently throw ObjectDisposedException (and the outer Count/Keys properties do). It’s safer and more consistent if the view properties also call ThrowIfDisposed() before touching dictionary state.

This issue also appears on line 909 of the same file.

        public int Count => _dict._count;

        /// <summary>Gets a value indicating whether the view is read-only. Always <c>true</c>.</summary>
        public bool IsReadOnly => true;

CHANGELOG.md:12

  • The new [Unreleased] bullets are much longer than the project’s changelog guidance (“a few sentences at most”, user-facing, no implementation walkthrough). This is called out in CONTRIBUTING.md under “Changelog entries”, and overly long sections are also a release risk because the workflow uses the section verbatim as the GitHub Release body.
- **`IDictionary<TKey, TValue?>` on the mutable dictionaries** — the nine hash-table and dense dictionaries now implement the mutable BCL interface alongside `IReadOnlyDictionary<,>`, so they drop into any API taking `IDictionary<,>`. `Keys` / `Values` widen to read-only `ICollection<T>` views, and `Contains` / `Remove` over a `KeyValuePair<,>` match on the pair — both as `Dictionary<,>` does. Additive: no existing public signature changed. Closes [#307](https://github.com/marius-bughiu/Celerity/issues/307).
- A public `CopyTo(KeyValuePair<TKey, TValue?>[], int)` on those dictionaries, plus `Contains` / `CopyTo` / `IsReadOnly` on their `Keys` / `Values` views. Closes [#307](https://github.com/marius-bughiu/Celerity/issues/307).
- `DictionaryInterfaceTests` — a cross-collection suite pinning the interface contract against a `Dictionary<,>` oracle, one row per dictionary, with matching Native AOT smoke coverage. Closes [#307](https://github.com/marius-bughiu/Celerity/issues/307).
- API-reference and README sections for the new interface, including `EnumMap`'s bounded-key caveat. Closes [#307](https://github.com/marius-bughiu/Celerity/issues/307).

Copilot AI review requested due to automatic review settings August 2, 2026 01:37
…ve disposal

The view structs hold a reference to the dictionary, so one captured while it was
alive outlives it — the one way to reach the backing arrays after they have gone
back to the pool. Contains and GetEnumerator already routed through members that
throw, but Count read _dict._count directly and reported a stale number, and the
CopyTo added in this PR would have raised a misleading ArgumentException from its
space guard rather than reporting the real problem.

Both views' Count and CopyTo now call ThrowIfDisposed first, closing the last
hole in the "every member throws after dispose" contract #296 established for
this type. IsReadOnly deliberately keeps answering: it is a constant that reads
no dictionary state.

Found by the Copilot review on #338.
@marius-bughiu

Copy link
Copy Markdown
Owner Author

Third review round — three suppressed comments, two accepted and one pushed back on. (Copilot posts these inside the review body rather than as inline threads, so there is nothing to resolve; replying here.)

1 & 2. PooledCelerityDictionary view Count / IsReadOnlyaccepted, fixed in 28bc647

Correct, and a real hole rather than a style point. The view structs hold a reference to the dictionary, so one captured while it was alive outlives it — that is the only way to reach the backing arrays after they have gone back to the pool. Contains and GetEnumerator already routed through members that throw (ContainsKey / ContainsValue / GetEnumerator all call ThrowIfDisposed), but Count read _dict._count directly and answered with a stale number. This was the last gap in the "every member throws after dispose" contract #296 established for this type.

Worth noting it was worse than reported on the code this PR adds: the new view CopyTo reads the same _count for its space guard, so against a disposed dictionary it would have thrown a misleading ArgumentException — with perfectly valid arguments — instead of reporting the actual problem. Both views' Count and CopyTo now call ThrowIfDisposed first.

IsReadOnly is the one member I deliberately left answering: it is a compile-time true that reads no dictionary state, so there is nothing stale to report and nothing pooled to touch. That is now stated in its <remarks> so it reads as a decision.

New PooledCelerityDictionary_CapturedViews_ShouldThrowAfterDispose covers all of it, including the IsReadOnly carve-out. Coverage holds at 100% line / 100% branch.

3. CHANGELOG length — respectfully pushed back

This one was already addressed in f96f5c0, one commit before the review ran; the quoted text is the condensed version, not the original. The four bullets are now one tight line per rollout facet, and the first is three sentences — inside CLAUDE.md's "a few sentences at most", and materially shorter than the adjacent [Unreleased] entries for #310 and #312 that are already on main. Trimming further would have to drop the drop-in claim, which is the entire user-facing point of the change.

The detail that made the original bullets too long now lives where it belongs: the semantics table in docs/api/collections.md, and the two design calls in ROADMAP.md and the PR body.

A ### Fixed bullet was added in 28bc647 for the disposal fix above, since that one is a behaviour change a caller could notice.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 15 out of 15 changed files in this pull request and generated no new comments.

Copilot AI review requested due to automatic review settings August 2, 2026 01:42

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 15 out of 15 changed files in this pull request and generated no new comments.

@github-actions

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown

Benchmarks

5 regressions ⚠️ vs main, 7 improvements ✅ (rows past ±10% beyond noise).

Highlights

Benchmark This PR StdDev main Δ
EnumMapBenchmark.EnumMap_Add 225.9 ns 74.4 ns 149.3 ns +51.3% ⚠️
CelerityMultiMapBenchmark.CelerityMultiMap_Insert(ItemCount: 1000) 40.34 μs 1.60 μs 36.58 μs +10.3% ⚠️
CelerityMultiMapBenchmark.Dictionary_Remove(ItemCount: 100000) 2.03 ms 147.83 μs 1.82 ms +11.9% ⚠️
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Lookup(ItemCount: 100000) 2.00 ms 16.95 μs 2.23 ms -10.1% ✅
HyperLogLogBenchmark.HashSet_Estimate(ItemCount: 1000) 0.0 ns 0.0 ns 0.2 ns -99.8% ✅
PooledCelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 5.28 μs 531.6 ns 4.72 μs +11.8% ⚠️
LruCacheBenchmark.Dictionary_Put(ItemCount: 100000) 6.43 ms 921.28 μs 8.22 ms -21.8% ✅
DequeBenchmark.Deque_Queue(ItemCount: 1000) 35.86 μs 2.89 μs 31.08 μs +15.4% ⚠️
IntDictionaryBenchmark.IntDictionary_Remove(ItemCount: 100000) 2.79 ms 2.18 ms 6.66 ms -58.1% ✅
TrieBenchmark.Trie_PrefixMatch(ItemCount: 100000) 6.15 ms 198.35 μs 6.88 ms -10.6% ✅
LongDictionaryBenchmark.LongDictionary_Remove(ItemCount: 100000) 2.49 ms 2.01 ms 6.81 ms -63.4% ✅
RobinHoodSetBenchmark.RobinHoodSet_Remove(ItemCount: 1000) 108.18 μs 3.65 μs 125.25 μs -13.6% ✅
Collections (536)
Benchmark This PR StdDev main Δ
EnumMapBenchmark.Dictionary_Add 589.2 ns 5.9 ns 591.9 ns -0.5%
EnumMapBenchmark.EnumMap_Add 225.9 ns 74.4 ns 149.3 ns +51.3% ⚠️
SmallSetBenchmark.HashSet_Add(ItemCount: 8) 159.7 ns 1.1 ns 158.0 ns +1.1%
SmallSetBenchmark.SmallSet_Add(ItemCount: 8) 45.7 ns 1.5 ns 46.5 ns -1.7%
SmallSetBenchmark.HashSet_Add(ItemCount: 64) 751.5 ns 41.9 ns 740.3 ns +1.5%
SmallSetBenchmark.SmallSet_Add(ItemCount: 64) 1.66 μs 10.3 ns 1.66 μs -0.1%
SmallSetBenchmark.HashSet_Contains(ItemCount: 8) 37.1 ns 0.2 ns 37.1 ns +0.0%
SmallSetBenchmark.SmallSet_Contains(ItemCount: 8) 19.2 ns 0.1 ns 19.0 ns +0.8%
SmallSetBenchmark.HashSet_Contains(ItemCount: 64) 299.7 ns 0.6 ns 299.2 ns +0.2%
SmallSetBenchmark.SmallSet_Contains(ItemCount: 64) 1.10 μs 12.5 ns 1.10 μs +0.5%
IndexedPriorityQueueBenchmark.PriorityQueue_DecreaseKey(ItemCount: 1000) 147.26 μs 1.37 μs 143.73 μs +2.5%
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_DecreaseKey(ItemCount: 1000) 264.07 μs 703.1 ns 260.76 μs +1.3%
IndexedPriorityQueueBenchmark.PriorityQueue_DecreaseKey(ItemCount: 100000) 32.19 ms 428.16 μs 32.63 ms -1.3%
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_DecreaseKey(ItemCount: 100000) 55.60 ms 374.28 μs 55.66 ms -0.1%
IndexedPriorityQueueBenchmark.PriorityQueue_Enqueue(ItemCount: 1000) 4.57 μs 59.4 ns 4.61 μs -0.9%
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_Enqueue(ItemCount: 1000) 29.64 μs 169.1 ns 30.43 μs -2.6%
IndexedPriorityQueueBenchmark.PriorityQueue_Enqueue(ItemCount: 100000) 1.07 ms 14.62 μs 1.08 ms -1.4%
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_Enqueue(ItemCount: 100000) 6.44 ms 163.72 μs 6.37 ms +1.1%
EnumMapBenchmark.Dictionary_Enumerate 50.4 ns 0.2 ns 50.3 ns +0.2%
EnumMapBenchmark.EnumMap_Enumerate 39.7 ns 0.1 ns 39.8 ns -0.4%
CelerityMultiMapBenchmark.Dictionary_Insert(ItemCount: 1000) 28.40 μs 106.2 ns 28.07 μs +1.2%
RobinHoodDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 13.43 μs 675.7 ns 12.72 μs +5.6%
CelerityMultiMapBenchmark.CelerityMultiMap_Insert(ItemCount: 1000) 40.34 μs 1.60 μs 36.58 μs +10.3% ⚠️
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Insert(ItemCount: 1000) 17.84 μs 113.2 ns 17.45 μs +2.2%
CelerityMultiMapBenchmark.Dictionary_Insert(ItemCount: 100000) 12.43 ms 557.59 μs 11.89 ms +4.5%
RobinHoodDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.60 ms 70.50 μs 4.60 ms -0.1%
CelerityMultiMapBenchmark.CelerityMultiMap_Insert(ItemCount: 100000) 16.93 ms 189.21 μs 16.89 ms +0.2%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Insert(ItemCount: 100000) 7.70 ms 553.73 μs 8.09 ms -4.8%
EnumMapBenchmark.Dictionary_Lookup 117.7 ns 0.1 ns 117.8 ns -0.1%
EnumMapBenchmark.EnumMap_Lookup 63.2 ns 0.1 ns 63.1 ns +0.2%
CelerityMultiMapBenchmark.Dictionary_Lookup(ItemCount: 1000) 5.04 μs 17.7 ns 5.03 μs +0.1%
RobinHoodDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.74 μs 14.5 ns 4.71 μs +0.7%
CelerityMultiMapBenchmark.CelerityMultiMap_Lookup(ItemCount: 1000) 2.35 μs 2.8 ns 2.35 μs +0.0%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Lookup(ItemCount: 1000) 3.09 μs 246.0 ns 2.82 μs +9.8%
CelerityMultiMapBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.74 ms 4.32 μs 1.74 ms +0.1%
RobinHoodDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.60 ms 1.71 μs 1.60 ms -0.1%
CelerityMultiMapBenchmark.CelerityMultiMap_Lookup(ItemCount: 100000) 725.43 μs 3.53 μs 722.47 μs +0.4%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Lookup(ItemCount: 100000) 836.30 μs 19.87 μs 821.27 μs +1.8%
EnumMapBenchmark.Dictionary_Remove 3.24 μs 142.3 ns 3.28 μs -1.2%
EnumMapBenchmark.EnumMap_Remove 1.84 μs 391.8 ns 1.48 μs +23.9%
SmallSetBenchmark.HashSet_Remove(ItemCount: 8) 413.7 ns 35.0 ns 314.3 ns +31.6%
SmallSetBenchmark.SmallSet_Remove(ItemCount: 8) 1.15 μs 71.4 ns 1.18 μs -2.7%
SmallSetBenchmark.HashSet_Remove(ItemCount: 64) 1.31 μs 49.3 ns 1.53 μs -14.6%
SmallSetBenchmark.SmallSet_Remove(ItemCount: 64) 27.33 μs 3.52 μs 26.97 μs +1.3%
CelerityMultiMapBenchmark.Dictionary_Remove(ItemCount: 1000) 27.34 μs 1.45 μs 28.03 μs -2.4%
RobinHoodDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 79.99 μs 6.28 μs 82.74 μs -3.3%
CelerityMultiMapBenchmark.CelerityMultiMap_Remove(ItemCount: 1000) 133.12 μs 10.83 μs 121.10 μs +9.9%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Remove(ItemCount: 1000) 108.87 μs 4.68 μs 111.81 μs -2.6%
CelerityMultiMapBenchmark.Dictionary_Remove(ItemCount: 100000) 2.03 ms 147.83 μs 1.82 ms +11.9% ⚠️
RobinHoodDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.05 ms 25.50 μs 2.04 ms +0.7%
CelerityMultiMapBenchmark.CelerityMultiMap_Remove(ItemCount: 100000) 1.72 ms 80.53 μs 1.64 ms +4.8%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Remove(ItemCount: 100000) 1.76 ms 73.02 μs 1.73 ms +2.0%
CompressedIntSetBenchmark.HashSet_Add(ItemCount: 1000) 11.74 μs 41.2 ns 11.98 μs -2.0%
LongSetBenchmark.HashSet_Add(ItemCount: 1000) 12.85 μs 182.9 ns 13.65 μs -5.9%
CompressedIntSetBenchmark.CompressedIntSet_Add(ItemCount: 1000) 33.96 μs 172.1 ns 34.16 μs -0.6%
LongSetBenchmark.LongSet_Add(ItemCount: 1000) 9.23 μs 131.7 ns 9.62 μs -4.0%
CompressedIntSetBenchmark.HashSet_Add(ItemCount: 100000) 3.45 ms 42.66 μs 3.51 ms -1.9%
LongSetBenchmark.HashSet_Add(ItemCount: 100000) 4.43 ms 138.55 μs 4.59 ms -3.4%
CompressedIntSetBenchmark.CompressedIntSet_Add(ItemCount: 100000) 11.07 ms 423.87 μs 10.70 ms +3.5%
LongSetBenchmark.LongSet_Add(ItemCount: 100000) 6.03 ms 41.88 μs 6.17 ms -2.3%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Build(ItemCount: 1000) 162.50 μs 2.01 μs 161.06 μs +0.9%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Build(ItemCount: 1000) 3.80 ms 149.96 μs 3.85 ms -1.3%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Build(ItemCount: 100000) 28.92 ms 540.91 μs 28.74 ms +0.6%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Build(ItemCount: 100000) 1.52 s 52.93 ms 1.51 s +0.2%
CompressedIntSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.70 μs 8.3 ns 4.70 μs -0.1%
LongSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.90 μs 171.7 ns 4.75 μs +3.3%
CompressedIntSetBenchmark.CompressedIntSet_Contains(ItemCount: 1000) 13.49 μs 19.9 ns 13.48 μs +0.1%
LongSetBenchmark.LongSet_Contains(ItemCount: 1000) 2.00 μs 8.3 ns 2.01 μs -0.3%
StringKeyProbeBenchmark.HashSet_Contains(ItemCount: 1000) 18.12 μs 110.7 ns 18.15 μs -0.2%
StringKeyProbeBenchmark.CeleritySet_Contains(ItemCount: 1000) 24.39 μs 38.4 ns 24.36 μs +0.1%
CompressedIntSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.57 ms 5.41 μs 1.58 ms -0.6%
LongSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.62 ms 10.46 μs 1.66 ms -2.2%
CompressedIntSetBenchmark.CompressedIntSet_Contains(ItemCount: 100000) 8.29 ms 28.23 μs 8.33 ms -0.5%
LongSetBenchmark.LongSet_Contains(ItemCount: 100000) 640.16 μs 1.80 μs 647.47 μs -1.1%
StringKeyProbeBenchmark.HashSet_Contains(ItemCount: 100000) 3.46 ms 47.94 μs 3.53 ms -1.8%
StringKeyProbeBenchmark.CeleritySet_Contains(ItemCount: 100000) 4.97 ms 124.45 μs 4.81 ms +3.4%
StringInternTableBenchmark.Dictionary_Dedupe(ItemCount: 1000) 33.38 μs 254.1 ns 34.73 μs -3.9%
StringInternTableBenchmark.StringInternTable_Dedupe(ItemCount: 1000) 35.87 μs 95.4 ns 35.74 μs +0.4%
StringInternTableBenchmark.Dictionary_Dedupe(ItemCount: 100000) 3.32 ms 70.70 μs 3.32 ms +0.0%
StringInternTableBenchmark.StringInternTable_Dedupe(ItemCount: 100000) 3.20 ms 9.96 μs 3.20 ms +0.0%
CompressedIntSetBenchmark.HashSet_Except(ItemCount: 1000) 57.81 μs 6.89 μs 60.71 μs -4.8%
CompressedIntSetBenchmark.CompressedIntSet_Except(ItemCount: 1000) 70.48 μs 9.48 μs 68.62 μs +2.7%
CompressedIntSetBenchmark.HashSet_Except(ItemCount: 100000) 2.53 ms 23.29 μs 2.54 ms -0.4%
CompressedIntSetBenchmark.CompressedIntSet_Except(ItemCount: 100000) 1.11 ms 10.63 μs 1.10 ms +1.6%
CelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 14.03 μs 621.4 ns 13.05 μs +7.6%
CelerityDictionaryBenchmark.CelerityDictionary_Insert(ItemCount: 1000) 11.57 μs 119.5 ns 11.70 μs -1.2%
CelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.11 ms 60.05 μs 4.17 ms -1.2%
CelerityDictionaryBenchmark.CelerityDictionary_Insert(ItemCount: 100000) 4.90 ms 51.77 μs 4.83 ms +1.5%
CompressedIntSetBenchmark.HashSet_IntersectClustered(ItemCount: 1000) 35.34 μs 3.40 μs 44.35 μs -20.3%
CompressedIntSetBenchmark.CompressedIntSet_IntersectClustered(ItemCount: 1000) 1.44 μs 293.7 ns 1.47 μs -2.2%
CompressedIntSetBenchmark.HashSet_IntersectClustered(ItemCount: 100000) 970.82 μs 8.85 μs 960.96 μs +1.0%
CompressedIntSetBenchmark.CompressedIntSet_IntersectClustered(ItemCount: 100000) 2.13 μs 326.7 ns 1.55 μs +37.2%
CompressedIntSetBenchmark.HashSet_IntersectDense(ItemCount: 1000) 47.87 μs 6.07 μs 43.21 μs +10.8%
CompressedIntSetBenchmark.CompressedIntSet_IntersectDense(ItemCount: 1000) 51.75 μs 5.09 μs 49.67 μs +4.2%
CompressedIntSetBenchmark.HashSet_IntersectDense(ItemCount: 100000) 3.12 ms 11.56 μs 3.13 ms -0.6%
CompressedIntSetBenchmark.CompressedIntSet_IntersectDense(ItemCount: 100000) 92.34 μs 24.42 μs 84.46 μs +9.3%
CompressedIntSetBenchmark.HashSet_IntersectSparse(ItemCount: 1000) 54.25 μs 6.89 μs 49.88 μs +8.8%
CompressedIntSetBenchmark.CompressedIntSet_IntersectSparse(ItemCount: 1000) 58.33 μs 4.35 μs 58.30 μs +0.0%
CompressedIntSetBenchmark.HashSet_IntersectSparse(ItemCount: 100000) 3.87 ms 64.55 μs 3.87 ms -0.0%
CompressedIntSetBenchmark.CompressedIntSet_IntersectSparse(ItemCount: 100000) 954.02 μs 8.50 μs 947.87 μs +0.6%
StringKeyProbeBenchmark.Dictionary_Lookup(ItemCount: 1000) 18.70 μs 306.5 ns 18.62 μs +0.4%
StringKeyProbeBenchmark.CelerityDictionary_Lookup(ItemCount: 1000) 26.79 μs 147.7 ns 29.40 μs -8.9%
CelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.72 μs 12.6 ns 4.78 μs -1.2%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Lookup(ItemCount: 1000) 7.32 μs 8.4 ns 7.43 μs -1.5%
StringInternTableBenchmark.HashSet_Lookup(ItemCount: 1000) 32.19 μs 118.3 ns 32.83 μs -2.0%
CelerityDictionaryBenchmark.CelerityDictionary_Lookup(ItemCount: 1000) 2.47 μs 5.5 ns 2.48 μs -0.2%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Lookup(ItemCount: 1000) 84.47 μs 560.4 ns 86.62 μs -2.5%
StringInternTableBenchmark.StringInternTable_Lookup(ItemCount: 1000) 31.38 μs 22.2 ns 31.40 μs -0.1%
StringKeyProbeBenchmark.Dictionary_Lookup(ItemCount: 100000) 3.58 ms 26.13 μs 3.66 ms -2.2%
StringKeyProbeBenchmark.CelerityDictionary_Lookup(ItemCount: 100000) 5.14 ms 53.48 μs 5.53 ms -7.0%
CelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.59 ms 8.62 μs 1.60 ms -0.6%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Lookup(ItemCount: 100000) 2.00 ms 16.95 μs 2.23 ms -10.1% ✅
StringInternTableBenchmark.HashSet_Lookup(ItemCount: 100000) 3.26 ms 9.95 μs 3.35 ms -2.6%
CelerityDictionaryBenchmark.CelerityDictionary_Lookup(ItemCount: 100000) 732.30 μs 3.29 μs 735.83 μs -0.5%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Lookup(ItemCount: 100000) 7.62 ms 36.47 μs 7.80 ms -2.3%
StringInternTableBenchmark.StringInternTable_Lookup(ItemCount: 100000) 3.17 ms 4.84 μs 3.18 ms -0.1%
StringKeyProbeBenchmark.Dictionary_LookupMissing(ItemCount: 1000) 14.91 μs 66.1 ns 15.04 μs -0.9%
StringKeyProbeBenchmark.CelerityDictionary_LookupMissing(ItemCount: 1000) 28.62 μs 15.9 ns 28.52 μs +0.3%
StringKeyProbeBenchmark.Dictionary_LookupMissing(ItemCount: 100000) 3.94 ms 37.10 μs 4.04 ms -2.7%
StringKeyProbeBenchmark.CelerityDictionary_LookupMissing(ItemCount: 100000) 5.64 ms 17.96 μs 6.02 ms -6.4%
CelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 82.08 μs 5.84 μs 83.99 μs -2.3%
LongSetBenchmark.HashSet_Remove(ItemCount: 1000) 76.41 μs 5.98 μs 74.23 μs +2.9%
CelerityDictionaryBenchmark.CelerityDictionary_Remove(ItemCount: 1000) 121.90 μs 8.20 μs 123.66 μs -1.4%
LongSetBenchmark.LongSet_Remove(ItemCount: 1000) 91.42 μs 3.48 μs 87.61 μs +4.3%
CelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.06 ms 28.87 μs 2.05 ms +0.4%
LongSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.97 ms 20.02 μs 2.01 ms -1.8%
CelerityDictionaryBenchmark.CelerityDictionary_Remove(ItemCount: 100000) 1.72 ms 144.67 μs 1.58 ms +8.9%
LongSetBenchmark.LongSet_Remove(ItemCount: 100000) 1.43 ms 18.60 μs 1.45 ms -1.3%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_SpanLookup(ItemCount: 1000) 29.81 μs 152.5 ns 30.95 μs -3.7%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_SpanLookup(ItemCount: 1000) 91.23 μs 227.2 ns 91.25 μs -0.0%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_SpanLookup(ItemCount: 100000) 5.82 ms 85.34 μs 6.04 ms -3.7%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_SpanLookup(ItemCount: 100000) 8.60 ms 51.11 μs 8.74 ms -1.6%
CompressedIntSetBenchmark.HashSet_Union(ItemCount: 1000) 27.16 μs 765.2 ns 27.35 μs -0.7%
CompressedIntSetBenchmark.CompressedIntSet_Union(ItemCount: 1000) 81.69 μs 5.41 μs 74.75 μs +9.3%
CompressedIntSetBenchmark.HashSet_Union(ItemCount: 100000) 3.86 ms 120.02 μs 3.99 ms -3.3%
CompressedIntSetBenchmark.CompressedIntSet_Union(ItemCount: 100000) 1.23 ms 54.93 μs 1.18 ms +4.3%
CeleritySetBenchmark.HashSet_Add(ItemCount: 1000) 14.22 μs 318.0 ns 13.91 μs +2.2%
CuckooFilterBenchmark.HashSet_Add(ItemCount: 1000) 13.62 μs 203.6 ns 13.64 μs -0.2%
HyperLogLogBenchmark.HashSet_Add(ItemCount: 1000) 14.40 μs 273.7 ns 13.80 μs +4.4%
CeleritySetBenchmark.CeleritySet_Add(ItemCount: 1000) 9.45 μs 47.0 ns 9.43 μs +0.2%
CuckooFilterBenchmark.CuckooFilter_Add(ItemCount: 1000) 7.25 μs 16.7 ns 7.25 μs -0.0%
HyperLogLogBenchmark.HyperLogLog_Add(ItemCount: 1000) 27.57 μs 73.6 ns 27.59 μs -0.1%
CeleritySetBenchmark.HashSet_Add(ItemCount: 100000) 5.14 ms 163.93 μs 5.19 ms -0.8%
CuckooFilterBenchmark.HashSet_Add(ItemCount: 100000) 4.78 ms 73.54 μs 4.81 ms -0.6%
HyperLogLogBenchmark.HashSet_Add(ItemCount: 100000) 5.01 ms 50.29 μs 4.93 ms +1.7%
CeleritySetBenchmark.CeleritySet_Add(ItemCount: 100000) 3.35 ms 63.24 μs 3.22 ms +3.9%
CuckooFilterBenchmark.CuckooFilter_Add(ItemCount: 100000) 2.08 ms 7.10 μs 2.10 ms -0.9%
HyperLogLogBenchmark.HyperLogLog_Add(ItemCount: 100000) 576.69 μs 1.25 μs 575.86 μs +0.1%
RankSelectBitVectorBenchmark.Array_Build(ItemCount: 1024) 91.5 ns 0.2 ns 91.9 ns -0.5%
RankSelectBitVectorBenchmark.RankSelectBitVector_Build(ItemCount: 1024) 64.5 ns 1.5 ns 64.3 ns +0.2%
RankSelectBitVectorBenchmark.Array_Build(ItemCount: 1000000) 68.31 μs 590.5 ns 68.21 μs +0.1%
RankSelectBitVectorBenchmark.RankSelectBitVector_Build(ItemCount: 1000000) 89.76 μs 1.30 μs 88.44 μs +1.5%
CeleritySetBenchmark.HashSet_Contains(ItemCount: 1000) 4.72 μs 15.1 ns 4.74 μs -0.3%
CuckooFilterBenchmark.HashSet_Contains(ItemCount: 1000) 4.72 μs 5.2 ns 4.84 μs -2.6%
CeleritySetBenchmark.CeleritySet_Contains(ItemCount: 1000) 1.85 μs 5.6 ns 1.85 μs +0.1%
CuckooFilterBenchmark.CuckooFilter_Contains(ItemCount: 1000) 4.91 μs 5.0 ns 4.92 μs -0.0%
CeleritySetBenchmark.HashSet_Contains(ItemCount: 100000) 1.62 ms 4.97 μs 1.59 ms +1.9%
CuckooFilterBenchmark.HashSet_Contains(ItemCount: 100000) 1.62 ms 10.88 μs 1.62 ms -0.4%
CeleritySetBenchmark.CeleritySet_Contains(ItemCount: 100000) 601.31 μs 1.20 μs 601.71 μs -0.1%
CuckooFilterBenchmark.CuckooFilter_Contains(ItemCount: 100000) 1.77 ms 15.41 μs 1.77 ms +0.3%
CuckooFilterBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.59 μs 38.5 ns 4.54 μs +1.1%
CuckooFilterBenchmark.CuckooFilter_ContainsMissing(ItemCount: 1000) 8.43 μs 9.0 ns 8.43 μs +0.1%
CuckooFilterBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.97 ms 6.40 μs 1.96 ms +0.7%
CuckooFilterBenchmark.CuckooFilter_ContainsMissing(ItemCount: 100000) 875.20 μs 744.5 ns 884.45 μs -1.0%
HyperLogLogBenchmark.HashSet_Estimate(ItemCount: 1000) 0.0 ns 0.0 ns 0.2 ns -99.8% ✅
HyperLogLogBenchmark.HyperLogLog_Estimate(ItemCount: 1000) 23.44 μs 16.6 ns 23.47 μs -0.1%
HyperLogLogBenchmark.HashSet_Estimate(ItemCount: 100000) 0.0 ns 0.0 ns 0.0 ns +26.7%
HyperLogLogBenchmark.HyperLogLog_Estimate(ItemCount: 100000) 22.98 μs 5.8 ns 22.99 μs -0.1%
LruCacheBenchmark.Dictionary_Get(ItemCount: 1000) 25.13 μs 354.5 ns 24.80 μs +1.3%
LruCacheBenchmark.LruCache_Get(ItemCount: 1000) 7.08 μs 252.5 ns 6.94 μs +2.1%
LruCacheBenchmark.Dictionary_Get(ItemCount: 100000) 24.74 μs 22.6 ns 25.39 μs -2.6%
LruCacheBenchmark.LruCache_Get(ItemCount: 100000) 6.85 μs 49.8 ns 6.98 μs -1.8%
LruCacheBenchmark.Dictionary_GetMissing(ItemCount: 1000) 4.77 μs 100.9 ns 4.81 μs -0.8%
LruCacheBenchmark.LruCache_GetMissing(ItemCount: 1000) 3.59 μs 5.1 ns 3.60 μs -0.1%
LruCacheBenchmark.Dictionary_GetMissing(ItemCount: 100000) 519.76 μs 530.4 ns 519.73 μs +0.0%
LruCacheBenchmark.LruCache_GetMissing(ItemCount: 100000) 1.34 ms 375.8 ns 1.34 ms +0.1%
PooledCelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 14.77 μs 286.5 ns 15.90 μs -7.1%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Insert(ItemCount: 1000) 8.07 μs 48.4 ns 8.23 μs -2.0%
PooledCelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 5.07 ms 62.46 μs 5.05 ms +0.5%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Insert(ItemCount: 100000) 3.02 ms 30.57 μs 3.02 ms +0.2%
PooledCelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 5.28 μs 531.6 ns 4.72 μs +11.8% ⚠️
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Lookup(ItemCount: 1000) 2.34 μs 3.4 ns 2.42 μs -3.1%
PooledCelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.63 ms 4.17 μs 1.63 ms -0.5%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Lookup(ItemCount: 100000) 838.18 μs 111.32 μs 819.41 μs +2.3%
LruCacheBenchmark.Dictionary_Put(ItemCount: 1000) 100.39 μs 3.36 μs 109.30 μs -8.1%
LruCacheBenchmark.LruCache_Put(ItemCount: 1000) 482.03 μs 18.44 μs 488.97 μs -1.4%
LruCacheBenchmark.Dictionary_Put(ItemCount: 100000) 6.43 ms 921.28 μs 8.22 ms -21.8% ✅
LruCacheBenchmark.LruCache_Put(ItemCount: 100000) 5.82 ms 25.24 μs 5.78 ms +0.7%
RankSelectBitVectorBenchmark.Array_RankEarly(ItemCount: 1024) 1.23 μs 1.7 ns 1.23 μs -0.1%
RankSelectBitVectorBenchmark.RankSelectBitVector_RankEarly(ItemCount: 1024) 1.88 μs 13.3 ns 1.88 μs +0.3%
RankSelectBitVectorBenchmark.Array_RankEarly(ItemCount: 1000000) 33.09 μs 237.9 ns 33.06 μs +0.1%
RankSelectBitVectorBenchmark.RankSelectBitVector_RankEarly(ItemCount: 1000000) 1.88 μs 2.4 ns 1.88 μs +0.0%
RankSelectBitVectorBenchmark.Array_RankLate(ItemCount: 1024) 6.47 μs 31.0 ns 6.47 μs -0.1%
RankSelectBitVectorBenchmark.RankSelectBitVector_RankLate(ItemCount: 1024) 1.88 μs 1.4 ns 1.88 μs -0.1%
RankSelectBitVectorBenchmark.Array_RankLate(ItemCount: 1000000) 4.99 ms 47.64 μs 4.95 ms +0.9%
RankSelectBitVectorBenchmark.RankSelectBitVector_RankLate(ItemCount: 1000000) 1.97 μs 3.8 ns 1.88 μs +4.7%
RankSelectBitVectorBenchmark.Array_RankMid(ItemCount: 1024) 4.87 μs 16.2 ns 4.87 μs +0.1%
RankSelectBitVectorBenchmark.RankSelectBitVector_RankMid(ItemCount: 1024) 1.88 μs 2.1 ns 1.88 μs +0.0%
RankSelectBitVectorBenchmark.Array_RankMid(ItemCount: 1000000) 2.53 ms 27.10 μs 2.53 ms +0.2%
RankSelectBitVectorBenchmark.RankSelectBitVector_RankMid(ItemCount: 1000000) 1.88 μs 1.8 ns 1.88 μs +0.0%
CeleritySetBenchmark.HashSet_Remove(ItemCount: 1000) 34.05 μs 4.40 μs 34.98 μs -2.7%
PooledCelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 95.59 μs 12.57 μs 88.74 μs +7.7%
CeleritySetBenchmark.CeleritySet_Remove(ItemCount: 1000) 117.83 μs 10.89 μs 125.90 μs -6.4%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Remove(ItemCount: 1000) 131.73 μs 13.04 μs 131.64 μs +0.1%
CuckooFilterBenchmark.HashSet_Remove(ItemCount: 1000) 13.47 μs 107.8 ns 13.60 μs -1.0%
CuckooFilterBenchmark.CuckooFilter_Remove(ItemCount: 1000) 13.15 μs 40.9 ns 13.09 μs +0.5%
CeleritySetBenchmark.HashSet_Remove(ItemCount: 100000) 1.74 ms 31.78 μs 1.77 ms -1.3%
PooledCelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.12 ms 61.31 μs 2.16 ms -1.8%
CeleritySetBenchmark.CeleritySet_Remove(ItemCount: 100000) 1.64 ms 223.92 μs 1.49 ms +10.1%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Remove(ItemCount: 100000) 1.64 ms 29.11 μs 2.02 ms -18.9%
CuckooFilterBenchmark.HashSet_Remove(ItemCount: 100000) 4.09 ms 125.68 μs 4.04 ms +1.4%
CuckooFilterBenchmark.CuckooFilter_Remove(ItemCount: 100000) 4.02 ms 10.44 μs 3.99 ms +0.7%
RankSelectBitVectorBenchmark.Array_Select(ItemCount: 1024) 13.02 μs 46.9 ns 12.99 μs +0.2%
RankSelectBitVectorBenchmark.RankSelectBitVector_Select(ItemCount: 1024) 11.40 μs 23.9 ns 11.41 μs -0.1%
RankSelectBitVectorBenchmark.Array_Select(ItemCount: 1000000) 4.23 ms 3.80 μs 4.23 ms +0.0%
RankSelectBitVectorBenchmark.RankSelectBitVector_Select(ItemCount: 1000000) 25.60 μs 157.6 ns 25.55 μs +0.2%
BTreeDictionaryBenchmark.SortedDictionary_Add(ItemCount: 1000) 62.31 μs 3.79 μs 64.76 μs -3.8%
CountMinSketchBenchmark.Dictionary_Add(ItemCount: 1000) 10.34 μs 25.0 ns 10.37 μs -0.3%
PooledCeleritySetBenchmark.HashSet_Add(ItemCount: 1000) 12.07 μs 101.2 ns 12.18 μs -0.9%
BTreeDictionaryBenchmark.BTreeDictionary_Add(ItemCount: 1000) 54.10 μs 1.27 μs 53.93 μs +0.3%
CountMinSketchBenchmark.CountMinSketch_Add(ItemCount: 1000) 10.43 μs 43.7 ns 10.23 μs +2.0%
PooledCeleritySetBenchmark.PooledCeleritySet_Add(ItemCount: 1000) 8.25 μs 163.9 ns 8.47 μs -2.7%
BTreeDictionaryBenchmark.SortedDictionary_Add(ItemCount: 100000) 23.66 ms 132.76 μs 23.90 ms -1.0%
CountMinSketchBenchmark.Dictionary_Add(ItemCount: 100000) 1.44 ms 6.02 μs 1.44 ms +0.4%
PooledCeleritySetBenchmark.HashSet_Add(ItemCount: 100000) 4.78 ms 42.29 μs 4.80 ms -0.4%
BTreeDictionaryBenchmark.BTreeDictionary_Add(ItemCount: 100000) 16.01 ms 23.23 μs 16.17 ms -1.0%
CountMinSketchBenchmark.CountMinSketch_Add(ItemCount: 100000) 965.07 μs 2.49 μs 963.50 μs +0.2%
PooledCeleritySetBenchmark.PooledCeleritySet_Add(ItemCount: 100000) 2.85 ms 29.69 μs 2.86 ms -0.3%
BitSetBenchmark.BitArray_And(ItemCount: 1024) 56.8 ns 1.7 ns 55.1 ns +3.0%
BitSetBenchmark.BitSet_And(ItemCount: 1024) 1.25 μs 6.1 ns 1.24 μs +0.4%
BitSetBenchmark.BitArray_And(ItemCount: 1000000) 44.34 μs 216.8 ns 44.23 μs +0.2%
BitSetBenchmark.BitSet_And(ItemCount: 1000000) 4.47 ms 3.28 μs 4.47 ms +0.0%
PooledCeleritySetBenchmark.HashSet_Contains(ItemCount: 1000) 4.74 μs 5.6 ns 4.91 μs -3.5%
PooledCeleritySetBenchmark.PooledCeleritySet_Contains(ItemCount: 1000) 1.96 μs 38.5 ns 1.97 μs -0.4%
PooledCeleritySetBenchmark.HashSet_Contains(ItemCount: 100000) 1.59 ms 3.83 μs 1.57 ms +1.7%
PooledCeleritySetBenchmark.PooledCeleritySet_Contains(ItemCount: 100000) 579.18 μs 1.14 μs 578.42 μs +0.1%
DequeBenchmark.LinkedList_Enumerate(ItemCount: 1000) 1.37 μs 0.4 ns 1.37 μs +0.0%
DequeBenchmark.Deque_Enumerate(ItemCount: 1000) 941.3 ns 0.8 ns 941.8 ns -0.0%
DequeBenchmark.LinkedList_Enumerate(ItemCount: 100000) 135.12 μs 163.3 ns 135.02 μs +0.1%
DequeBenchmark.Deque_Enumerate(ItemCount: 100000) 93.77 μs 89.2 ns 93.80 μs -0.0%
CountMinSketchBenchmark.Dictionary_Estimate(ItemCount: 1000) 4.38 μs 7.1 ns 4.53 μs -3.4%
CountMinSketchBenchmark.CountMinSketch_Estimate(ItemCount: 1000) 10.05 μs 15.0 ns 10.07 μs -0.2%
CountMinSketchBenchmark.Dictionary_Estimate(ItemCount: 100000) 503.30 μs 16.23 μs 489.59 μs +2.8%
CountMinSketchBenchmark.CountMinSketch_Estimate(ItemCount: 100000) 1.97 ms 3.65 μs 1.97 ms +0.1%
IntDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 13.41 μs 187.1 ns 13.25 μs +1.3%
IntDictionaryBenchmark.IntDictionary_Insert(ItemCount: 1000) 11.35 μs 68.7 ns 11.37 μs -0.2%
IntDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.15 ms 76.58 μs 4.17 ms -0.6%
IntDictionaryBenchmark.IntDictionary_Insert(ItemCount: 100000) 4.84 ms 56.01 μs 4.82 ms +0.4%
BTreeDictionaryBenchmark.SortedDictionary_Lookup(ItemCount: 1000) 36.44 μs 1.19 μs 35.16 μs +3.6%
IntDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.73 μs 16.5 ns 4.72 μs +0.2%
BTreeDictionaryBenchmark.BTreeDictionary_Lookup(ItemCount: 1000) 25.42 μs 58.2 ns 25.39 μs +0.1%
IntDictionaryBenchmark.IntDictionary_Lookup(ItemCount: 1000) 2.14 μs 3.2 ns 2.14 μs +0.0%
BTreeDictionaryBenchmark.SortedDictionary_Lookup(ItemCount: 100000) 18.35 ms 45.78 μs 17.94 ms +2.3%
IntDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.60 ms 8.05 μs 1.59 ms +0.6%
BTreeDictionaryBenchmark.BTreeDictionary_Lookup(ItemCount: 100000) 13.23 ms 113.35 μs 13.11 ms +0.9%
IntDictionaryBenchmark.IntDictionary_Lookup(ItemCount: 100000) 677.46 μs 4.49 μs 700.43 μs -3.3%
BTreeDictionaryBenchmark.SortedDictionary_Mixed(ItemCount: 1000) 186.83 μs 1.73 μs 195.28 μs -4.3%
BTreeDictionaryBenchmark.BTreeDictionary_Mixed(ItemCount: 1000) 90.21 μs 8.74 μs 82.11 μs +9.9%
BTreeDictionaryBenchmark.SortedDictionary_Mixed(ItemCount: 100000) 48.32 ms 666.11 μs 48.46 ms -0.3%
BTreeDictionaryBenchmark.BTreeDictionary_Mixed(ItemCount: 100000) 26.35 ms 21.03 μs 26.58 ms -0.9%
BitSetBenchmark.BitArray_Or(ItemCount: 1024) 55.0 ns 0.2 ns 52.5 ns +4.8%
BitSetBenchmark.BitSet_Or(ItemCount: 1024) 1.24 μs 4.6 ns 1.24 μs -0.1%
BitSetBenchmark.BitArray_Or(ItemCount: 1000000) 44.13 μs 300.3 ns 44.25 μs -0.3%
BitSetBenchmark.BitSet_Or(ItemCount: 1000000) 4.47 ms 2.93 μs 4.43 ms +0.8%
BitSetBenchmark.BitArray_PopCount(ItemCount: 1024) 1.24 μs 2.6 ns 1.24 μs +0.0%
BitSetBenchmark.BitSet_PopCount(ItemCount: 1024) 7.1 ns 0.0 ns 6.9 ns +3.1%
BitSetBenchmark.BitArray_PopCount(ItemCount: 1000000) 4.82 ms 1.94 μs 4.82 ms -0.0%
BitSetBenchmark.BitSet_PopCount(ItemCount: 1000000) 4.98 μs 49.5 ns 4.94 μs +0.9%
DequeBenchmark.LinkedList_PushFront(ItemCount: 1000) 35.17 μs 1.74 μs 43.07 μs -18.3%
DequeBenchmark.Deque_PushFront(ItemCount: 1000) 21.65 μs 4.20 μs 24.26 μs -10.8%
DequeBenchmark.LinkedList_PushFront(ItemCount: 100000) 1.78 ms 37.04 μs 1.84 ms -2.9%
DequeBenchmark.Deque_PushFront(ItemCount: 100000) 734.85 μs 183.70 μs 709.61 μs +3.6%
DequeBenchmark.LinkedList_Queue(ItemCount: 1000) 61.68 μs 4.29 μs 59.96 μs +2.9%
DequeBenchmark.Deque_Queue(ItemCount: 1000) 35.86 μs 2.89 μs 31.08 μs +15.4% ⚠️
DequeBenchmark.LinkedList_Queue(ItemCount: 100000) 4.14 ms 104.09 μs 4.10 ms +1.0%
DequeBenchmark.Deque_Queue(ItemCount: 100000) 415.39 μs 17.53 μs 420.55 μs -1.2%
BTreeDictionaryBenchmark.SortedDictionary_RangeScan(ItemCount: 1000) 4.51 μs 12.2 ns 4.50 μs +0.3%
BTreeDictionaryBenchmark.BTreeDictionary_RangeScan(ItemCount: 1000) 77.6 ns 0.4 ns 77.7 ns -0.1%
BTreeDictionaryBenchmark.SortedDictionary_RangeScan(ItemCount: 100000) 1.24 ms 2.32 μs 1.25 ms -0.4%
BTreeDictionaryBenchmark.BTreeDictionary_RangeScan(ItemCount: 100000) 5.80 μs 15.6 ns 5.78 μs +0.2%
BTreeDictionaryBenchmark.SortedDictionary_Remove(ItemCount: 1000) 780.11 μs 17.91 μs 788.66 μs -1.1%
IntDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 79.80 μs 6.79 μs 85.20 μs -6.3%
PooledCeleritySetBenchmark.HashSet_Remove(ItemCount: 1000) 30.30 μs 4.71 μs 27.58 μs +9.8%
BTreeDictionaryBenchmark.BTreeDictionary_Remove(ItemCount: 1000) 312.48 μs 13.45 μs 307.17 μs +1.7%
IntDictionaryBenchmark.IntDictionary_Remove(ItemCount: 1000) 92.55 μs 7.67 μs 98.10 μs -5.7%
PooledCeleritySetBenchmark.PooledCeleritySet_Remove(ItemCount: 1000) 112.44 μs 7.48 μs 116.63 μs -3.6%
BTreeDictionaryBenchmark.SortedDictionary_Remove(ItemCount: 100000) 26.75 ms 652.26 μs 26.77 ms -0.1%
IntDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.06 ms 15.45 μs 2.05 ms +0.5%
PooledCeleritySetBenchmark.HashSet_Remove(ItemCount: 100000) 1.71 ms 13.27 μs 1.72 ms -0.5%
BTreeDictionaryBenchmark.BTreeDictionary_Remove(ItemCount: 100000) 18.15 ms 43.84 μs 18.19 ms -0.3%
IntDictionaryBenchmark.IntDictionary_Remove(ItemCount: 100000) 2.79 ms 2.18 ms 6.66 ms -58.1% ✅
PooledCeleritySetBenchmark.PooledCeleritySet_Remove(ItemCount: 100000) 1.37 ms 11.79 μs 1.37 ms -0.2%
BitSetBenchmark.BitArray_Xor(ItemCount: 1024) 54.8 ns 0.3 ns 81.3 ns -32.6%
BitSetBenchmark.BitSet_Xor(ItemCount: 1024) 1.23 μs 22.7 ns 1.21 μs +1.4%
BitSetBenchmark.BitArray_Xor(ItemCount: 1000000) 44.82 μs 699.0 ns 44.08 μs +1.7%
BitSetBenchmark.BitSet_Xor(ItemCount: 1000000) 4.47 ms 3.47 μs 4.47 ms -0.0%
TrieBenchmark.Dictionary_Add(ItemCount: 1000) 37.50 μs 8.08 μs 40.83 μs -8.2%
TrieBenchmark.Trie_Add(ItemCount: 1000) 545.13 μs 22.19 μs 468.13 μs +16.4%
BTreeSetBenchmark.SortedSet_Add(ItemCount: 1000) 41.92 μs 1.30 μs 41.65 μs +0.6%
IntSetBenchmark.HashSet_Add(ItemCount: 1000) 12.14 μs 92.9 ns 12.00 μs +1.2%
TopKSketchBenchmark.Dictionary_Add(ItemCount: 1000) 13.18 μs 194.7 ns 12.91 μs +2.1%
BTreeSetBenchmark.BTreeSet_Add(ItemCount: 1000) 41.91 μs 156.2 ns 41.71 μs +0.5%
IntSetBenchmark.IntSet_Add(ItemCount: 1000) 8.39 μs 35.1 ns 8.39 μs -0.0%
TopKSketchBenchmark.TopKSketch_Add(ItemCount: 1000) 87.18 μs 796.0 ns 87.39 μs -0.2%
TrieBenchmark.Dictionary_Add(ItemCount: 100000) 4.65 ms 1.25 ms 4.69 ms -1.0%
TrieBenchmark.Trie_Add(ItemCount: 100000) 26.63 ms 533.09 μs 26.36 ms +1.0%
BTreeSetBenchmark.SortedSet_Add(ItemCount: 100000) 20.97 ms 102.24 μs 21.05 ms -0.4%
IntSetBenchmark.HashSet_Add(ItemCount: 100000) 4.93 ms 78.48 μs 5.07 ms -2.8%
TopKSketchBenchmark.Dictionary_Add(ItemCount: 100000) 3.28 ms 83.88 μs 3.21 ms +2.2%
BTreeSetBenchmark.BTreeSet_Add(ItemCount: 100000) 14.01 ms 107.24 μs 14.00 ms +0.1%
IntSetBenchmark.IntSet_Add(ItemCount: 100000) 3.16 ms 23.67 μs 3.16 ms +0.2%
TopKSketchBenchmark.TopKSketch_Add(ItemCount: 100000) 14.52 ms 191.54 μs 14.43 ms +0.6%
DisjointSetBenchmark.Dictionary_Components(ItemCount: 1000) 18.18 μs 99.5 ns 18.07 μs +0.6%
DisjointSetBenchmark.DisjointSet_Components(ItemCount: 1000) 16.46 μs 344.0 ns 16.23 μs +1.4%
DisjointSetBenchmark.Dictionary_Components(ItemCount: 100000) 4.29 ms 73.30 μs 4.25 ms +0.9%
DisjointSetBenchmark.DisjointSet_Components(ItemCount: 100000) 3.13 ms 46.95 μs 3.15 ms -0.4%
DisjointSetBenchmark.Dictionary_Connected(ItemCount: 1000) 9.84 μs 177.2 ns 9.42 μs +4.5%
DisjointSetBenchmark.DisjointSet_Connected(ItemCount: 1000) 12.11 μs 8.8 ns 12.61 μs -4.0%
DisjointSetBenchmark.Dictionary_Connected(ItemCount: 100000) 254.76 μs 1.28 μs 256.74 μs -0.8%
DisjointSetBenchmark.DisjointSet_Connected(ItemCount: 100000) 337.70 μs 1.06 μs 336.41 μs +0.4%
BTreeSetBenchmark.SortedSet_Contains(ItemCount: 1000) 16.72 μs 30.3 ns 16.75 μs -0.2%
IntSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.74 μs 3.7 ns 4.75 μs -0.2%
BTreeSetBenchmark.BTreeSet_Contains(ItemCount: 1000) 17.15 μs 22.7 ns 17.17 μs -0.1%
IntSetBenchmark.IntSet_Contains(ItemCount: 1000) 1.81 μs 8.5 ns 1.81 μs -0.2%
BTreeSetBenchmark.SortedSet_Contains(ItemCount: 100000) 15.82 ms 69.91 μs 15.70 ms +0.7%
IntSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.60 ms 51.41 μs 1.56 ms +2.5%
BTreeSetBenchmark.BTreeSet_Contains(ItemCount: 100000) 12.86 ms 265.78 μs 12.79 ms +0.5%
IntSetBenchmark.IntSet_Contains(ItemCount: 100000) 571.67 μs 820.7 ns 574.76 μs -0.5%
LongDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 14.77 μs 473.6 ns 14.26 μs +3.6%
LongDictionaryBenchmark.LongDictionary_Insert(ItemCount: 1000) 11.14 μs 30.9 ns 11.17 μs -0.3%
LongDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.94 ms 21.13 μs 5.01 ms -1.4%
LongDictionaryBenchmark.LongDictionary_Insert(ItemCount: 100000) 6.68 ms 105.21 μs 6.73 ms -0.7%
LongDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.83 μs 60.2 ns 4.88 μs -0.9%
TrieBenchmark.Dictionary_Lookup(ItemCount: 1000) 13.32 μs 498.9 ns 12.91 μs +3.2%
LongDictionaryBenchmark.LongDictionary_Lookup(ItemCount: 1000) 2.27 μs 6.5 ns 2.27 μs +0.2%
TrieBenchmark.Trie_Lookup(ItemCount: 1000) 41.19 μs 402.1 ns 41.22 μs -0.1%
LongDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.58 ms 2.18 μs 1.58 ms +0.3%
TrieBenchmark.Dictionary_Lookup(ItemCount: 100000) 2.68 ms 3.95 μs 2.68 ms -0.1%
LongDictionaryBenchmark.LongDictionary_Lookup(ItemCount: 100000) 698.32 μs 3.26 μs 690.39 μs +1.1%
TrieBenchmark.Trie_Lookup(ItemCount: 100000) 8.30 ms 36.10 μs 8.30 ms +0.0%
BTreeSetBenchmark.SortedSet_Mixed(ItemCount: 1000) 99.89 μs 1.17 μs 100.00 μs -0.1%
BTreeSetBenchmark.BTreeSet_Mixed(ItemCount: 1000) 61.23 μs 1.98 μs 63.37 μs -3.4%
BTreeSetBenchmark.SortedSet_Mixed(ItemCount: 100000) 31.46 ms 176.39 μs 31.54 ms -0.3%
BTreeSetBenchmark.BTreeSet_Mixed(ItemCount: 100000) 24.54 ms 258.75 μs 24.31 ms +0.9%
TrieBenchmark.Dictionary_PrefixMatch(ItemCount: 1000) 73.55 μs 301.5 ns 73.40 μs +0.2%
TrieBenchmark.Trie_PrefixMatch(ItemCount: 1000) 55.79 μs 205.6 ns 55.84 μs -0.1%
TrieBenchmark.Dictionary_PrefixMatch(ItemCount: 100000) 7.39 ms 8.48 μs 7.39 ms -0.0%
TrieBenchmark.Trie_PrefixMatch(ItemCount: 100000) 6.15 ms 198.35 μs 6.88 ms -10.6% ✅
BTreeSetBenchmark.SortedSet_RangeScan(ItemCount: 1000) 169.2 ns 2.6 ns 167.0 ns +1.3%
BTreeSetBenchmark.BTreeSet_RangeScan(ItemCount: 1000) 73.8 ns 0.1 ns 74.2 ns -0.5%
BTreeSetBenchmark.SortedSet_RangeScan(ItemCount: 100000) 9.12 μs 302.5 ns 9.46 μs -3.6%
BTreeSetBenchmark.BTreeSet_RangeScan(ItemCount: 100000) 5.24 μs 52.5 ns 5.19 μs +1.1%
BTreeSetBenchmark.SortedSet_Remove(ItemCount: 1000) 729.32 μs 17.46 μs 723.59 μs +0.8%
IntSetBenchmark.HashSet_Remove(ItemCount: 1000) 31.03 μs 4.53 μs 31.60 μs -1.8%
LongDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 86.66 μs 8.14 μs 84.32 μs +2.8%
BTreeSetBenchmark.BTreeSet_Remove(ItemCount: 1000) 271.62 μs 13.53 μs 272.35 μs -0.3%
IntSetBenchmark.IntSet_Remove(ItemCount: 1000) 82.87 μs 5.94 μs 87.66 μs -5.5%
LongDictionaryBenchmark.LongDictionary_Remove(ItemCount: 1000) 88.88 μs 5.13 μs 90.95 μs -2.3%
BTreeSetBenchmark.SortedSet_Remove(ItemCount: 100000) 25.06 ms 128.39 μs 25.14 ms -0.3%
IntSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.72 ms 20.57 μs 1.72 ms -0.3%
LongDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.01 ms 24.28 μs 2.00 ms +0.5%
BTreeSetBenchmark.BTreeSet_Remove(ItemCount: 100000) 15.73 ms 158.00 μs 15.58 ms +1.0%
IntSetBenchmark.IntSet_Remove(ItemCount: 100000) 1.33 ms 8.59 μs 1.33 ms -0.2%
LongDictionaryBenchmark.LongDictionary_Remove(ItemCount: 100000) 2.49 ms 2.01 ms 6.81 ms -63.4% ✅
TrieBenchmark.Dictionary_SpanLookup(ItemCount: 1000) 39.97 μs 159.7 ns 39.69 μs +0.7%
TrieBenchmark.Trie_SpanLookup(ItemCount: 1000) 43.20 μs 408.0 ns 43.04 μs +0.4%
TrieBenchmark.Dictionary_SpanLookup(ItemCount: 100000) 5.63 ms 11.46 μs 5.64 ms -0.1%
TrieBenchmark.Trie_SpanLookup(ItemCount: 100000) 8.20 ms 22.36 μs 8.21 ms -0.2%
TopKSketchBenchmark.Dictionary_TopK(ItemCount: 1000) 28.9 ns 0.1 ns 29.3 ns -1.3%
TopKSketchBenchmark.TopKSketch_TopK(ItemCount: 1000) 1.21 μs 3.8 ns 1.20 μs +0.4%
TopKSketchBenchmark.Dictionary_TopK(ItemCount: 100000) 31.2 ns 2.3 ns 31.1 ns +0.5%
TopKSketchBenchmark.TopKSketch_TopK(ItemCount: 100000) 1.15 μs 4.1 ns 1.17 μs -1.3%
DisjointSetBenchmark.Dictionary_Union(ItemCount: 1000) 94.67 μs 262.5 ns 96.48 μs -1.9%
DisjointSetBenchmark.DisjointSet_Union(ItemCount: 1000) 26.14 μs 61.7 ns 26.42 μs -1.0%
DisjointSetBenchmark.Dictionary_Union(ItemCount: 100000) 40.49 ms 415.96 μs 40.51 ms -0.1%
DisjointSetBenchmark.DisjointSet_Union(ItemCount: 100000) 8.08 ms 21.33 μs 8.09 ms -0.1%
BloomFilterBenchmark.HashSet_Add(ItemCount: 1000) 12.43 μs 245.8 ns 12.54 μs -0.9%
HashCachingSetBenchmark.HashSet_Add(ItemCount: 1000) 12.29 μs 113.2 ns 12.51 μs -1.7%
SwissSetBenchmark.HashSet_Add(ItemCount: 1000) 12.45 μs 180.2 ns 12.80 μs -2.7%
BloomFilterBenchmark.BloomFilter_Add(ItemCount: 1000) 13.71 μs 12.9 ns 13.72 μs -0.1%
HashCachingSetBenchmark.HashCachingSet_Add(ItemCount: 1000) 10.53 μs 171.7 ns 10.60 μs -0.6%
SwissSetBenchmark.SwissSet_Add(ItemCount: 1000) 19.89 μs 138.7 ns 19.77 μs +0.6%
BloomFilterBenchmark.HashSet_Add(ItemCount: 100000) 3.96 ms 128.66 μs 4.00 ms -1.0%
HashCachingSetBenchmark.HashSet_Add(ItemCount: 100000) 3.71 ms 382.91 μs 3.66 ms +1.4%
SwissSetBenchmark.HashSet_Add(ItemCount: 100000) 3.79 ms 119.02 μs 3.80 ms -0.1%
BloomFilterBenchmark.BloomFilter_Add(ItemCount: 100000) 995.04 μs 14.15 μs 1.01 ms -1.5%
HashCachingSetBenchmark.HashCachingSet_Add(ItemCount: 100000) 4.95 ms 146.24 μs 5.11 ms -3.2%
SwissSetBenchmark.SwissSet_Add(ItemCount: 100000) 3.41 ms 106.43 μs 3.34 ms +2.0%
FrozenCeleritySetBenchmark.FrozenSet_Build(ItemCount: 1000) 162.18 μs 680.4 ns 162.29 μs -0.1%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Build(ItemCount: 1000) 3.32 ms 77.68 μs 3.26 ms +1.9%
FrozenCeleritySetBenchmark.FrozenSet_Build(ItemCount: 100000) 27.90 ms 180.72 μs 28.42 ms -1.8%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Build(ItemCount: 100000) 1.56 s 86.11 ms 1.55 s +0.7%
BloomFilterBenchmark.HashSet_Contains(ItemCount: 1000) 4.04 μs 10.6 ns 4.03 μs +0.3%
FrozenCeleritySetBenchmark.FrozenSet_Contains(ItemCount: 1000) 5.81 μs 9.2 ns 6.39 μs -9.1%
HashCachingSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.05 μs 7.4 ns 4.04 μs +0.3%
SwissSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.04 μs 4.6 ns 4.03 μs +0.1%
BloomFilterBenchmark.BloomFilter_Contains(ItemCount: 1000) 12.29 μs 4.8 ns 12.29 μs -0.0%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Contains(ItemCount: 1000) 99.01 μs 8.63 μs 91.87 μs +7.8%
HashCachingSetBenchmark.HashCachingSet_Contains(ItemCount: 1000) 2.33 μs 2.3 ns 2.33 μs +0.1%
SwissSetBenchmark.SwissSet_Contains(ItemCount: 1000) 2.71 μs 4.7 ns 2.70 μs +0.1%
BloomFilterBenchmark.HashSet_Contains(ItemCount: 100000) 1.45 ms 2.85 μs 1.45 ms +0.4%
FrozenCeleritySetBenchmark.FrozenSet_Contains(ItemCount: 100000) 2.22 ms 31.11 μs 2.16 ms +2.4%
HashCachingSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.43 ms 6.61 μs 1.39 ms +3.3%
SwissSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.44 ms 12.67 μs 1.47 ms -2.2%
BloomFilterBenchmark.BloomFilter_Contains(ItemCount: 100000) 905.94 μs 233.9 ns 906.59 μs -0.1%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Contains(ItemCount: 100000) 7.44 ms 35.22 μs 7.54 ms -1.3%
HashCachingSetBenchmark.HashCachingSet_Contains(ItemCount: 100000) 750.14 μs 9.56 μs 756.83 μs -0.9%
SwissSetBenchmark.SwissSet_Contains(ItemCount: 100000) 430.32 μs 23.02 μs 461.56 μs -6.8%
BloomFilterBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 3.98 μs 3.8 ns 3.98 μs -0.0%
HashCachingSetBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 3.98 μs 33.7 ns 4.00 μs -0.5%
SwissSetBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 3.95 μs 50.1 ns 3.95 μs +0.1%
BloomFilterBenchmark.BloomFilter_ContainsMissing(ItemCount: 1000) 4.01 μs 115.4 ns 4.02 μs -0.1%
HashCachingSetBenchmark.HashCachingSet_ContainsMissing(ItemCount: 1000) 2.74 μs 7.5 ns 2.74 μs -0.0%
SwissSetBenchmark.SwissSet_ContainsMissing(ItemCount: 1000) 2.49 μs 2.9 ns 2.64 μs -5.4%
BloomFilterBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.86 ms 6.97 μs 1.85 ms +0.6%
HashCachingSetBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.77 ms 48.44 μs 1.86 ms -4.6%
SwissSetBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.85 ms 10.42 μs 1.85 ms -0.0%
BloomFilterBenchmark.BloomFilter_ContainsMissing(ItemCount: 100000) 1.49 ms 3.74 μs 1.49 ms +0.0%
HashCachingSetBenchmark.HashCachingSet_ContainsMissing(ItemCount: 100000) 1.10 ms 5.55 μs 1.12 ms -1.0%
SwissSetBenchmark.SwissSet_ContainsMissing(ItemCount: 100000) 355.06 μs 548.3 ns 353.33 μs +0.5%
CelerityMultiSetBenchmark.Dictionary_Count(ItemCount: 1000) 8.90 μs 16.8 ns 8.90 μs -0.1%
CelerityMultiSetBenchmark.CelerityMultiSet_Count(ItemCount: 1000) 5.11 μs 33.8 ns 5.07 μs +0.7%
CelerityMultiSetBenchmark.Dictionary_Count(ItemCount: 100000) 1.22 ms 10.25 μs 1.23 ms -0.9%
CelerityMultiSetBenchmark.CelerityMultiSet_Count(ItemCount: 100000) 705.55 μs 3.40 μs 702.06 μs +0.5%
SwissDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 13.09 μs 166.5 ns 13.05 μs +0.3%
SwissDictionaryBenchmark.SwissDictionary_Insert(ItemCount: 1000) 21.66 μs 251.7 ns 21.32 μs +1.6%
SwissDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 3.94 ms 79.88 μs 3.98 ms -1.1%
SwissDictionaryBenchmark.SwissDictionary_Insert(ItemCount: 100000) 3.03 ms 15.58 μs 3.04 ms -0.3%
CelerityMultiSetBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.15 μs 28.7 ns 4.14 μs +0.1%
SwissDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 5.98 μs 1.76 μs 8.08 μs -26.0%
CelerityMultiSetBenchmark.CelerityMultiSet_Lookup(ItemCount: 1000) 1.74 μs 1.6 ns 1.74 μs +0.0%
SwissDictionaryBenchmark.SwissDictionary_Lookup(ItemCount: 1000) 3.06 μs 9.7 ns 3.06 μs -0.0%
CelerityMultiSetBenchmark.Dictionary_Lookup(ItemCount: 100000) 560.28 μs 54.99 μs 506.77 μs +10.6%
SwissDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.45 ms 48.96 μs 1.51 ms -3.6%
CelerityMultiSetBenchmark.CelerityMultiSet_Lookup(ItemCount: 100000) 195.96 μs 4.33 μs 191.11 μs +2.5%
SwissDictionaryBenchmark.SwissDictionary_Lookup(ItemCount: 100000) 642.11 μs 14.92 μs 733.97 μs -12.5%
FenwickTreeBenchmark.Array_Mixed(ItemCount: 1000) 215.58 μs 60.6 ns 215.65 μs -0.0%
FenwickTreeBenchmark.FenwickTree_Mixed(ItemCount: 1000) 10.42 μs 198.0 ns 10.64 μs -2.0%
FenwickTreeBenchmark.Array_Mixed(ItemCount: 100000) 213.68 ms 181.60 μs 213.61 ms +0.0%
FenwickTreeBenchmark.FenwickTree_Mixed(ItemCount: 100000) 557.57 μs 11.81 μs 565.33 μs -1.4%
FenwickTreeBenchmark.Array_RangeSum(ItemCount: 1000) 205.35 μs 129.8 ns 205.48 μs -0.1%
FenwickTreeBenchmark.FenwickTree_RangeSum(ItemCount: 1000) 6.73 μs 16.3 ns 6.73 μs +0.0%
FenwickTreeBenchmark.Array_RangeSum(ItemCount: 100000) 191.60 ms 10.42 ms 192.05 ms -0.2%
FenwickTreeBenchmark.FenwickTree_RangeSum(ItemCount: 100000) 263.17 μs 240.2 ns 260.01 μs +1.2%
CelerityMultiSetBenchmark.Dictionary_Remove(ItemCount: 1000) 45.78 μs 4.21 μs 45.34 μs +1.0%
SwissDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 74.93 μs 8.17 μs 70.50 μs +6.3%
CelerityMultiSetBenchmark.CelerityMultiSet_Remove(ItemCount: 1000) 67.62 μs 4.47 μs 70.92 μs -4.6%
SwissDictionaryBenchmark.SwissDictionary_Remove(ItemCount: 1000) 64.83 μs 6.85 μs 62.65 μs +3.5%
HashCachingSetBenchmark.HashSet_Remove(ItemCount: 1000) 25.28 μs 1.60 μs 25.94 μs -2.6%
SwissSetBenchmark.HashSet_Remove(ItemCount: 1000) 27.97 μs 3.27 μs 31.08 μs -10.0%
HashCachingSetBenchmark.HashCachingSet_Remove(ItemCount: 1000) 95.37 μs 8.98 μs 98.35 μs -3.0%
SwissSetBenchmark.SwissSet_Remove(ItemCount: 1000) 60.91 μs 6.19 μs 61.08 μs -0.3%
CelerityMultiSetBenchmark.Dictionary_Remove(ItemCount: 100000) 565.89 μs 10.72 μs 560.87 μs +0.9%
SwissDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 1.87 ms 15.55 μs 1.92 ms -2.9%
CelerityMultiSetBenchmark.CelerityMultiSet_Remove(ItemCount: 100000) 1.20 ms 9.25 μs 1.20 ms -0.5%
SwissDictionaryBenchmark.SwissDictionary_Remove(ItemCount: 100000) 2.59 ms 2.14 ms 2.09 ms +24.1%
HashCachingSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.52 ms 14.93 μs 1.51 ms +0.6%
SwissSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.51 ms 17.77 μs 1.51 ms +0.6%
HashCachingSetBenchmark.HashCachingSet_Remove(ItemCount: 100000) 1.58 ms 50.91 μs 1.61 ms -1.8%
SwissSetBenchmark.SwissSet_Remove(ItemCount: 100000) 779.35 μs 39.05 μs 775.52 μs +0.5%
EnumSetBenchmark.HashSet_Add 608.2 ns 4.8 ns 641.6 ns -5.2%
EnumSetBenchmark.EnumSet_Add 89.1 ns 2.2 ns 86.7 ns +2.8%
RobinHoodSetBenchmark.HashSet_Add(ItemCount: 1000) 14.19 μs 88.0 ns 13.65 μs +3.9%
SparseSetBenchmark.HashSet_Add(ItemCount: 1000) 7.22 μs 137.3 ns 7.71 μs -6.3%
RobinHoodSetBenchmark.RobinHoodSet_Add(ItemCount: 1000) 18.58 μs 197.8 ns 18.68 μs -0.5%
SparseSetBenchmark.SparseSet_Add(ItemCount: 1000) 6.81 μs 50.1 ns 6.47 μs +5.3%
RobinHoodSetBenchmark.HashSet_Add(ItemCount: 100000) 4.95 ms 116.99 μs 4.85 ms +1.9%
SparseSetBenchmark.HashSet_Add(ItemCount: 100000) 1.83 ms 43.46 μs 1.76 ms +3.5%
RobinHoodSetBenchmark.RobinHoodSet_Add(ItemCount: 100000) 6.50 ms 52.51 μs 6.49 ms +0.2%
SparseSetBenchmark.SparseSet_Add(ItemCount: 100000) 1.63 ms 69.46 μs 1.57 ms +4.0%
XorFilterBenchmark.HashSet_Build(ItemCount: 1000) 8.24 μs 77.5 ns 8.32 μs -1.0%
XorFilterBenchmark.XorFilter_Build(ItemCount: 1000) 42.26 μs 460.9 ns 41.38 μs +2.1%
XorFilterBenchmark.HashSet_Build(ItemCount: 100000) 2.22 ms 108.93 μs 2.17 ms +2.3%
XorFilterBenchmark.XorFilter_Build(ItemCount: 100000) 12.83 ms 181.67 μs 12.85 ms -0.2%
SparseSetBenchmark.HashSet_ClearRefill(ItemCount: 1000) 5.97 μs 75.4 ns 6.01 μs -0.7%
SparseSetBenchmark.SparseSet_ClearRefill(ItemCount: 1000) 4.91 μs 256.6 ns 4.75 μs +3.4%
SparseSetBenchmark.HashSet_ClearRefill(ItemCount: 100000) 1.37 ms 1.64 μs 1.38 ms -0.9%
SparseSetBenchmark.SparseSet_ClearRefill(ItemCount: 100000) 661.14 μs 5.06 μs 637.06 μs +3.8%
EnumSetBenchmark.HashSet_Contains 175.2 ns 0.3 ns 175.5 ns -0.2%
EnumSetBenchmark.EnumSet_Contains 46.0 ns 0.1 ns 46.0 ns +0.0%
RobinHoodSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.74 μs 41.4 ns 4.72 μs +0.4%
SparseSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.65 μs 8.0 ns 4.70 μs -1.1%
XorFilterBenchmark.HashSet_Contains(ItemCount: 1000) 4.73 μs 5.5 ns 4.74 μs -0.2%
RobinHoodSetBenchmark.RobinHoodSet_Contains(ItemCount: 1000) 2.54 μs 41.6 ns 2.50 μs +1.5%
SparseSetBenchmark.SparseSet_Contains(ItemCount: 1000) 1.29 μs 2.0 ns 1.29 μs -0.0%
XorFilterBenchmark.XorFilter_Contains(ItemCount: 1000) 6.79 μs 10.8 ns 6.77 μs +0.3%
RobinHoodSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.62 ms 5.98 μs 1.61 ms +1.0%
SparseSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.38 ms 11.90 μs 1.38 ms +0.3%
XorFilterBenchmark.HashSet_Contains(ItemCount: 100000) 1.62 ms 1.97 μs 1.61 ms +0.7%
RobinHoodSetBenchmark.RobinHoodSet_Contains(ItemCount: 100000) 754.42 μs 2.32 μs 753.96 μs +0.1%
SparseSetBenchmark.SparseSet_Contains(ItemCount: 100000) 261.62 μs 2.90 μs 260.63 μs +0.4%
XorFilterBenchmark.XorFilter_Contains(ItemCount: 100000) 704.04 μs 351.6 ns 704.14 μs -0.0%
RobinHoodSetBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.54 μs 7.0 ns 4.54 μs +0.0%
XorFilterBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.54 μs 3.4 ns 4.54 μs +0.0%
RobinHoodSetBenchmark.RobinHoodSet_ContainsMissing(ItemCount: 1000) 2.74 μs 3.5 ns 2.75 μs -0.1%
XorFilterBenchmark.XorFilter_ContainsMissing(ItemCount: 1000) 6.78 μs 4.2 ns 6.77 μs +0.2%
RobinHoodSetBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.94 ms 18.78 μs 1.96 ms -1.1%
XorFilterBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.96 ms 6.94 μs 1.96 ms +0.1%
RobinHoodSetBenchmark.RobinHoodSet_ContainsMissing(ItemCount: 100000) 1.20 ms 1.14 μs 1.20 ms +0.3%
XorFilterBenchmark.XorFilter_ContainsMissing(ItemCount: 100000) 706.01 μs 537.5 ns 705.92 μs +0.0%
SmallDictionaryBenchmark.Dictionary_Insert(ItemCount: 8) 176.3 ns 1.7 ns 182.4 ns -3.4%
SmallDictionaryBenchmark.SmallDictionary_Insert(ItemCount: 8) 87.2 ns 2.6 ns 93.5 ns -6.7%
SmallDictionaryBenchmark.Dictionary_Insert(ItemCount: 64) 839.0 ns 10.5 ns 939.8 ns -10.7%
SmallDictionaryBenchmark.SmallDictionary_Insert(ItemCount: 64) 1.10 μs 10.6 ns 1.09 μs +0.7%
HashCachingDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 14.32 μs 420.5 ns 14.91 μs -3.9%
HashCachingDictionaryBenchmark.HashCachingDictionary_Insert(ItemCount: 1000) 12.46 μs 104.5 ns 13.12 μs -5.0%
HashCachingDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.84 ms 104.95 μs 4.85 ms -0.2%
HashCachingDictionaryBenchmark.HashCachingDictionary_Insert(ItemCount: 100000) 6.63 ms 262.84 μs 6.70 ms -1.0%
SmallDictionaryBenchmark.Dictionary_Lookup(ItemCount: 8) 37.1 ns 0.2 ns 37.0 ns +0.4%
SmallDictionaryBenchmark.SmallDictionary_Lookup(ItemCount: 8) 24.6 ns 3.7 ns 31.4 ns -21.5%
SmallDictionaryBenchmark.Dictionary_Lookup(ItemCount: 64) 298.3 ns 0.6 ns 301.2 ns -1.0%
SmallDictionaryBenchmark.SmallDictionary_Lookup(ItemCount: 64) 1.11 μs 10.5 ns 1.10 μs +1.7%
HashCachingDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.85 μs 137.5 ns 4.71 μs +3.0%
HashCachingDictionaryBenchmark.HashCachingDictionary_Lookup(ItemCount: 1000) 2.67 μs 38.7 ns 2.64 μs +1.1%
HashCachingDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.64 ms 3.66 μs 1.57 ms +4.3%
HashCachingDictionaryBenchmark.HashCachingDictionary_Lookup(ItemCount: 100000) 836.92 μs 4.00 μs 821.09 μs +1.9%
EnumSetBenchmark.HashSet_Remove 3.66 μs 522.6 ns 3.49 μs +4.9%
EnumSetBenchmark.EnumSet_Remove 1.41 μs 306.9 ns 1.29 μs +9.2%
SmallDictionaryBenchmark.Dictionary_Remove(ItemCount: 8) 1.62 μs 232.7 ns 1.35 μs +19.8%
SmallDictionaryBenchmark.SmallDictionary_Remove(ItemCount: 8) 1.35 μs 238.8 ns 1.24 μs +8.8%
SmallDictionaryBenchmark.Dictionary_Remove(ItemCount: 64) 4.95 μs 166.1 ns 4.78 μs +3.6%
SmallDictionaryBenchmark.SmallDictionary_Remove(ItemCount: 64) 24.41 μs 5.06 μs 22.38 μs +9.1%
HashCachingDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 86.26 μs 9.66 μs 84.54 μs +2.0%
HashCachingDictionaryBenchmark.HashCachingDictionary_Remove(ItemCount: 1000) 121.41 μs 9.91 μs 126.57 μs -4.1%
RobinHoodSetBenchmark.HashSet_Remove(ItemCount: 1000) 33.44 μs 4.43 μs 30.74 μs +8.8%
SparseSetBenchmark.HashSet_Remove(ItemCount: 1000) 29.76 μs 4.35 μs 26.55 μs +12.1%
RobinHoodSetBenchmark.RobinHoodSet_Remove(ItemCount: 1000) 108.18 μs 3.65 μs 125.25 μs -13.6% ✅
SparseSetBenchmark.SparseSet_Remove(ItemCount: 1000) 29.59 μs 4.47 μs 25.08 μs +18.0%
HashCachingDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.12 ms 56.88 μs 2.21 ms -3.9%
HashCachingDictionaryBenchmark.HashCachingDictionary_Remove(ItemCount: 100000) 2.24 ms 300.53 μs 2.43 ms -8.1%
RobinHoodSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.96 ms 98.30 μs 1.85 ms +6.0%
SparseSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.53 ms 20.40 μs 1.53 ms -0.2%
RobinHoodSetBenchmark.RobinHoodSet_Remove(ItemCount: 100000) 1.76 ms 349.39 μs 1.52 ms +15.9%
SparseSetBenchmark.SparseSet_Remove(ItemCount: 100000) 815.86 μs 19.60 μs 819.96 μs -0.5%
EnumSetBenchmark.HashSet_Union 451.0 ns 13.8 ns 473.6 ns -4.8%
EnumSetBenchmark.EnumSet_Union 23.1 ns 0.3 ns 24.0 ns -3.7%
Hashers (111)
Benchmark This PR StdDev main Δ
StringHasherBenchmark.Bcl_GetHashCode(Shape: ShortAscii) 15.40 μs 24.4 ns 15.40 μs +0.0%
StringHasherBenchmark.EqualityComparer_Default(Shape: ShortAscii) 15.41 μs 15.7 ns 15.39 μs +0.1%
StringHasherBenchmark.Djb2(Shape: ShortAscii) 22.74 μs 41.5 ns 22.72 μs +0.1%
StringHasherBenchmark.Djb2A(Shape: ShortAscii) 22.72 μs 22.8 ns 22.73 μs -0.1%
StringHasherBenchmark.Sdbm(Shape: ShortAscii) 33.13 μs 32.5 ns 33.12 μs +0.0%
StringHasherBenchmark.Elf(Shape: ShortAscii) 44.86 μs 281.4 ns 44.81 μs +0.1%
StringHasherBenchmark.Crc32(Shape: ShortAscii) 50.54 μs 64.3 ns 50.57 μs -0.1%
StringHasherBenchmark.Adler32(Shape: ShortAscii) 96.47 μs 58.6 ns 96.50 μs -0.0%
StringHasherBenchmark.FnV1(Shape: ShortAscii) 27.14 μs 23.1 ns 27.15 μs -0.0%
StringHasherBenchmark.FnV1_64(Shape: ShortAscii) 25.83 μs 45.7 ns 25.81 μs +0.1%
StringHasherBenchmark.FnV1A(Shape: ShortAscii) 11.08 μs 38.7 ns 11.06 μs +0.2%
StringHasherBenchmark.FnV1A_Full(Shape: ShortAscii) 25.85 μs 17.2 ns 25.85 μs +0.0%
StringHasherBenchmark.FnV1A_64(Shape: ShortAscii) 27.87 μs 12.2 ns 27.88 μs -0.0%
StringHasherBenchmark.JenkinsOaat(Shape: ShortAscii) 39.51 μs 34.3 ns 39.58 μs -0.2%
StringHasherBenchmark.Murmur2(Shape: ShortAscii) 15.41 μs 40.2 ns 15.41 μs +0.0%
StringHasherBenchmark.Murmur3(Shape: ShortAscii) 17.13 μs 26.7 ns 17.14 μs -0.1%
StringHasherBenchmark.XxHash32(Shape: ShortAscii) 16.92 μs 36.8 ns 16.90 μs +0.1%
StringHasherBenchmark.XxHash64(Shape: ShortAscii) 18.38 μs 12.5 ns 18.38 μs +0.0%
StringHasherBenchmark.XxHash3(Shape: ShortAscii) 15.44 μs 16.6 ns 15.51 μs -0.4%
StringHasherBenchmark.CityHash64(Shape: ShortAscii) 15.55 μs 14.2 ns 15.56 μs -0.0%
StringHasherBenchmark.MetroHash64(Shape: ShortAscii) 15.44 μs 8.5 ns 15.42 μs +0.1%
StringHasherBenchmark.SipHash13(Shape: ShortAscii) 27.62 μs 28.1 ns 27.63 μs -0.0%
StringHasherBenchmark.SipHash24(Shape: ShortAscii) 37.91 μs 14.9 ns 37.92 μs -0.0%
StringHasherBenchmark.HalfSipHash24(Shape: ShortAscii) 49.80 μs 92.6 ns 49.84 μs -0.1%
StringHasherBenchmark.HighwayHash64(Shape: ShortAscii) 413.36 μs 1.13 μs 439.61 μs -6.0%
StringHasherBenchmark.XxHash64_Hash64(Shape: ShortAscii) 17.35 μs 9.6 ns 17.35 μs -0.0%
StringHasherBenchmark.SipHash24_Hash64(Shape: ShortAscii) 37.86 μs 34.2 ns 37.87 μs -0.0%
StringHasherBenchmark.Bcl_GetHashCode(Shape: LongAscii) 96.99 μs 104.2 ns 96.95 μs +0.0%
StringHasherBenchmark.EqualityComparer_Default(Shape: LongAscii) 96.64 μs 66.7 ns 96.64 μs -0.0%
StringHasherBenchmark.Djb2(Shape: LongAscii) 223.92 μs 44.2 ns 223.80 μs +0.1%
StringHasherBenchmark.Djb2A(Shape: LongAscii) 223.85 μs 94.6 ns 223.80 μs +0.0%
StringHasherBenchmark.Sdbm(Shape: LongAscii) 308.29 μs 70.7 ns 308.23 μs +0.0%
StringHasherBenchmark.Elf(Shape: LongAscii) 579.15 μs 174.2 ns 578.71 μs +0.1%
StringHasherBenchmark.Crc32(Shape: LongAscii) 591.49 μs 167.6 ns 591.16 μs +0.1%
StringHasherBenchmark.Adler32(Shape: LongAscii) 786.71 μs 289.3 ns 786.98 μs -0.0%
StringHasherBenchmark.FnV1(Shape: LongAscii) 289.16 μs 87.2 ns 289.16 μs +0.0%
StringHasherBenchmark.FnV1_64(Shape: LongAscii) 283.06 μs 129.2 ns 283.02 μs +0.0%
StringHasherBenchmark.FnV1A(Shape: LongAscii) 122.97 μs 75.1 ns 122.99 μs -0.0%
StringHasherBenchmark.FnV1A_Full(Shape: LongAscii) 282.48 μs 135.9 ns 282.48 μs -0.0%
StringHasherBenchmark.FnV1A_64(Shape: LongAscii) 286.90 μs 77.7 ns 286.96 μs -0.0%
StringHasherBenchmark.JenkinsOaat(Shape: LongAscii) 378.72 μs 136.3 ns 378.61 μs +0.0%
StringHasherBenchmark.Murmur2(Shape: LongAscii) 101.72 μs 78.6 ns 101.74 μs -0.0%
StringHasherBenchmark.Murmur3(Shape: LongAscii) 115.74 μs 75.2 ns 115.81 μs -0.1%
StringHasherBenchmark.XxHash32(Shape: LongAscii) 73.55 μs 73.9 ns 73.71 μs -0.2%
StringHasherBenchmark.XxHash64(Shape: LongAscii) 95.34 μs 908.1 ns 94.46 μs +0.9%
StringHasherBenchmark.XxHash3(Shape: LongAscii) 81.95 μs 244.3 ns 81.80 μs +0.2%
StringHasherBenchmark.CityHash64(Shape: LongAscii) 124.35 μs 1.65 μs 123.92 μs +0.3%
StringHasherBenchmark.MetroHash64(Shape: LongAscii) 74.87 μs 267.3 ns 74.67 μs +0.3%
StringHasherBenchmark.SipHash13(Shape: LongAscii) 117.11 μs 75.6 ns 117.10 μs +0.0%
StringHasherBenchmark.SipHash24(Shape: LongAscii) 162.37 μs 503.6 ns 162.32 μs +0.0%
StringHasherBenchmark.HalfSipHash24(Shape: LongAscii) 251.02 μs 248.9 ns 251.11 μs -0.0%
StringHasherBenchmark.HighwayHash64(Shape: LongAscii) 828.56 μs 5.46 μs 831.49 μs -0.4%
StringHasherBenchmark.XxHash64_Hash64(Shape: LongAscii) 87.69 μs 745.2 ns 87.41 μs +0.3%
StringHasherBenchmark.SipHash24_Hash64(Shape: LongAscii) 162.46 μs 271.4 ns 162.44 μs +0.0%
StringHasherBenchmark.Bcl_GetHashCode(Shape: NonAscii) 22.88 μs 10.3 ns 22.88 μs -0.0%
StringHasherBenchmark.EqualityComparer_Default(Shape: NonAscii) 22.85 μs 15.5 ns 22.84 μs +0.0%
StringHasherBenchmark.Djb2(Shape: NonAscii) 43.08 μs 40.3 ns 43.08 μs +0.0%
StringHasherBenchmark.Djb2A(Shape: NonAscii) 43.08 μs 36.4 ns 43.09 μs -0.0%
StringHasherBenchmark.Sdbm(Shape: NonAscii) 61.64 μs 39.4 ns 61.64 μs +0.0%
StringHasherBenchmark.Elf(Shape: NonAscii) 100.04 μs 143.9 ns 100.15 μs -0.1%
StringHasherBenchmark.Crc32(Shape: NonAscii) 103.56 μs 49.3 ns 103.59 μs -0.0%
StringHasherBenchmark.Adler32(Shape: NonAscii) 174.48 μs 78.9 ns 174.50 μs -0.0%
StringHasherBenchmark.FnV1(Shape: NonAscii) 48.41 μs 23.3 ns 48.42 μs -0.0%
StringHasherBenchmark.FnV1_64(Shape: NonAscii) 50.19 μs 48.3 ns 50.27 μs -0.1%
StringHasherBenchmark.FnV1A(Shape: NonAscii) 21.96 μs 30.3 ns 22.03 μs -0.3%
StringHasherBenchmark.FnV1A_Full(Shape: NonAscii) 46.13 μs 94.4 ns 46.13 μs -0.0%
StringHasherBenchmark.FnV1A_64(Shape: NonAscii) 50.06 μs 46.0 ns 50.09 μs -0.1%
StringHasherBenchmark.JenkinsOaat(Shape: NonAscii) 73.35 μs 57.9 ns 73.36 μs -0.0%
StringHasherBenchmark.Murmur2(Shape: NonAscii) 27.01 μs 203.9 ns 27.04 μs -0.1%
StringHasherBenchmark.Murmur3(Shape: NonAscii) 31.66 μs 130.8 ns 31.65 μs +0.0%
StringHasherBenchmark.XxHash32(Shape: NonAscii) 23.88 μs 13.0 ns 23.87 μs +0.0%
StringHasherBenchmark.XxHash64(Shape: NonAscii) 30.06 μs 32.7 ns 30.04 μs +0.1%
StringHasherBenchmark.XxHash3(Shape: NonAscii) 23.31 μs 29.2 ns 23.61 μs -1.2%
StringHasherBenchmark.CityHash64(Shape: NonAscii) 22.26 μs 10.0 ns 22.31 μs -0.2%
StringHasherBenchmark.MetroHash64(Shape: NonAscii) 25.90 μs 9.6 ns 25.90 μs -0.0%
StringHasherBenchmark.SipHash13(Shape: NonAscii) 37.84 μs 102.6 ns 37.82 μs +0.1%
StringHasherBenchmark.SipHash24(Shape: NonAscii) 50.08 μs 36.7 ns 50.10 μs -0.0%
StringHasherBenchmark.HalfSipHash24(Shape: NonAscii) 73.03 μs 1.13 μs 73.77 μs -1.0%
StringHasherBenchmark.HighwayHash64(Shape: NonAscii) 477.31 μs 12.69 μs 495.05 μs -3.6%
StringHasherBenchmark.XxHash64_Hash64(Shape: NonAscii) 28.93 μs 14.9 ns 28.95 μs -0.1%
StringHasherBenchmark.SipHash24_Hash64(Shape: NonAscii) 51.47 μs 670.3 ns 51.71 μs -0.5%
IntegerHasherBenchmark.Guid_Bcl 1.27 μs 3.1 ns 1.27 μs -0.2%
IntegerHasherBenchmark.Guid_EqualityComparer 3.47 μs 4.5 ns 3.54 μs -1.9%
IntegerHasherBenchmark.Guid_Celerity 8.49 μs 13.9 ns 8.49 μs +0.0%
IntegerHasherBenchmark.Guid_Celerity_Hash64 8.03 μs 5.1 ns 8.04 μs -0.1%
IntegerHasherBenchmark.Int32_Bcl 687.9 ns 7.3 ns 686.3 ns +0.2%
IntegerHasherBenchmark.Int32_EqualityComparer 702.2 ns 2.7 ns 698.6 ns +0.5%
IntegerHasherBenchmark.Int32_Identity 684.4 ns 1.6 ns 682.2 ns +0.3%
IntegerHasherBenchmark.Int32_WangNaive 1.25 μs 0.4 ns 1.25 μs -0.0%
IntegerHasherBenchmark.Int32_Wang 3.03 μs 2.0 ns 3.03 μs -0.0%
IntegerHasherBenchmark.Int32_Murmur3 2.64 μs 2.2 ns 2.65 μs -0.0%
IntegerHasherBenchmark.Int64_Bcl 1.27 μs 0.8 ns 1.27 μs -0.0%
IntegerHasherBenchmark.Int64_EqualityComparer 1.25 μs 0.7 ns 1.25 μs -0.0%
IntegerHasherBenchmark.Int64_Identity 683.9 ns 0.9 ns 684.0 ns -0.0%
IntegerHasherBenchmark.Int64_WangNaive 1.87 μs 1.4 ns 1.87 μs -0.0%
IntegerHasherBenchmark.Int64_Wang 4.16 μs 3.9 ns 4.16 μs +0.0%
IntegerHasherBenchmark.Int64_Murmur3 2.37 μs 1.7 ns 2.37 μs -0.1%
IntegerHasherBenchmark.Int64_Wang_Hash64 4.16 μs 3.9 ns 4.16 μs +0.0%
IntegerHasherBenchmark.Int64_Murmur3_Hash64 2.37 μs 1.0 ns 2.37 μs -0.0%
IntegerHasherBenchmark.UInt32_Bcl 684.8 ns 0.5 ns 685.1 ns -0.0%
IntegerHasherBenchmark.UInt32_EqualityComparer 697.6 ns 1.3 ns 698.9 ns -0.2%
IntegerHasherBenchmark.UInt32_Default 1.25 μs 0.5 ns 1.25 μs -0.0%
IntegerHasherBenchmark.UInt32_Wang 3.02 μs 1.5 ns 3.02 μs -0.1%
IntegerHasherBenchmark.UInt32_Murmur3 2.64 μs 0.9 ns 2.64 μs +0.0%
IntegerHasherBenchmark.UInt64_Bcl 1.27 μs 0.6 ns 1.27 μs -0.0%
IntegerHasherBenchmark.UInt64_EqualityComparer 1.25 μs 0.6 ns 1.25 μs +0.0%
IntegerHasherBenchmark.UInt64_Default 2.37 μs 2.3 ns 2.37 μs +0.1%
IntegerHasherBenchmark.UInt64_Wang 4.16 μs 3.8 ns 4.16 μs +0.0%
IntegerHasherBenchmark.UInt64_WangNaive 1.87 μs 1.3 ns 1.87 μs -0.0%
IntegerHasherBenchmark.UInt64_Default_Hash64 2.37 μs 1.1 ns 2.37 μs -0.1%
IntegerHasherBenchmark.UInt64_Wang_Hash64 4.16 μs 5.1 ns 4.16 μs +0.1%

Same-runner A/B (sharded 8-way): main (69cb972) and this PR were built and benchmarked back-to-back on the same runner per shard, so hardware variance cancels out. ⚠️ = PR mean ≥ +10% slower than main and beyond combined std-dev; ✅ = correspondingly faster.

@marius-bughiu
marius-bughiu merged commit 9d13596 into main Aug 2, 2026
19 checks passed
@marius-bughiu
marius-bughiu deleted the feat/issue-307-idictionary branch August 2, 2026 08:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement IDictionary<TKey,TValue> on the dictionary family — the mirror of the set-interface gap

2 participants